Du är på rätt väg med ditt andra försök med logiska AND/OR
grupperingar istället för en CASE
, men om du vill föredra raden som matchar cmp_brand
över rader med ett tomt cmp_brand
och förvänta dig bara ett resultat tillbaka, strukturera din ORDER BY
för att sortera det icke-tomma cmp_brand
först och begränsa det totala resultatet till 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
Detta fungerar eftersom uttrycket cmp_brand <> ''
utvärderas till det booleska true/false
, som MySQL tolkar som 1/0
. En fallande sortering på dessa värden tvingar de icke-tomma att sortera (1 före 0).
Uppdatering efter kommentarer:
Eftersom du har möjlighet att returnera mer än en rad kan du inte lita på ORDER BY
. Istället kan du utföra en LEFT JOIN
mot samma bord. På ena sidan, matcha cmp_brand = ''
och på andra sidan matchar cmp_brand = '123_NIKE'
. Viktigt, returnera thumb
kolumn från båda sidorna av sammanfogningen.
Slå in det i en underfråga i FROM
sats, sedan kan du på översta nivån använda en SELECT CASE
för att föredra cmp_brand
om den inte är tom.
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
- Här är ett exempel där 123_NIKE matchar:http://sqlfiddle.com/#! 2/dfe228/31
- Och ett exempel där 124_NIKE inte matchar:http://sqlfiddle.com/# !2/dfe228/32