Sei sulla strada giusta con il tuo secondo tentativo, utilizzando AND/OR
logico raggruppamenti invece di un CASE
, ma se vuoi preferire la riga corrispondente a cmp_brand
su righe con un cmp_brand
vuoto e aspettati un solo risultato, struttura il tuo ORDER BY
per ordinare il cmp_brand
non vuoto prima e limita il risultato complessivo a 1.
SELECT thumb
FROM inf_brand_images
WHERE
is_active=1 AND
((cmp_brand = '' AND brand='NIKE') OR (cmp_brand='123_NIKE'))
/* non-empty cmp_brand will sort first */
ORDER BY cmp_brand <> '' DESC
/* and the end result is limited only to the first sorted row
which will be the cmp_brand if matched, or the brand otherwise */
LIMIT 1
http://sqlfiddle.com/#!2/d176b/2
Funziona perché l'espressione cmp_brand <> ''
restituisce il booleano true/false
, che MySQL interpreta come 1/0
. Un ordinamento decrescente su quei valori costringe quelli non vuoti a ordinare il pugno (1 prima di 0).
Aggiorna dopo i commenti:
Dal momento che hai la possibilità di restituire più di una riga, non puoi fare affidamento su ORDER BY
. Invece, puoi eseguire un LEFT JOIN
contro lo stesso tavolo. Su un lato, abbina cmp_brand = ''
e dall'altro lato abbina cmp_brand = '123_NIKE'
. Importante, restituisci il thumb
colonna da entrambi lati dell'unione.
Inseriscilo in una sottoquery nel FROM
clausola, quindi al livello più alto puoi usare un SELECT CASE
preferire il cmp_brand
se non vuoto.
SELECT DISTINCT
CASE WHEN cbcb IS NOT NULL THEN cbthumb ELSE bthumb END AS thumb
FROM (
/* Return thumbs from both sides of the join */
SELECT
b.thumb AS bthumb,
b.cmp_brand AS bcb,
cb.thumb AS cbthumb,
cb.cmp_brand AS cbcb
FROM
inf_brand_images b
/* join the table against itself with the matching cmp_brand in the join condition */
LEFT JOIN inf_brand_images cb
ON b.brand = cb.brand
AND cb.cmp_brand = '123_NIKE'
WHERE
/* The WHERE clause looks for empty cmp_brand on the left side of the join */
b.brand = 'NIKE' AND b.cmp_brand = ''
) thumbs
- Ecco un esempio in cui 123_NIKE corrisponde:http://sqlfiddle.com/#! 2/dfe228/31
- E un esempio in cui 124_NIKE non corrisponde:http://sqlfiddle.com/# !2/dfe228/32