Při druhém pokusu jste na správné cestě pomocí logického AND/OR
seskupení namísto CASE
, ale pokud chcete preferovat řádek odpovídající cmp_brand
přes řádky s prázdnou značkou cmp_brand
a očekávejte zpět pouze jeden výsledek, strukturujte svůj ORDER BY
seřadit neprázdný cmp_brand
nejprve a omezte celkový výsledek na 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
Funguje to, protože výraz cmp_brand <> ''
vyhodnotí jako logickou hodnotu true/false
, kterou MySQL interpretuje jako 1/0
. Sestupné řazení těchto hodnot přinutí neprázdné, aby se seřadily jako první (1 před 0).
Aktualizace po komentářích:
Protože máte možnost vrátit více než jeden řádek, nemůžete se spoléhat na ORDER BY
. Místo toho můžete provést LEFT JOIN
proti stejnému stolu. Na jedné straně musí odpovídat cmp_brand = ''
a na druhé straně odpovídá cmp_brand = '123_NIKE'
. Důležité je vrátit thumb
sloupec z oba strany spojení.
Zabalte to do poddotazu v FROM
klauzuli, pak na nejvyšší úrovni můžete použít SELECT CASE
preferovat značku cmp_brand
pokud není prázdný.
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
- Zde je příklad, kde se shoduje 123_NIKE:http://sqlfiddle.com/#! 2/dfe228/31
- Příklad, kdy 124_NIKE neodpovídá:http://sqlfiddle.com/# !2/dfe228/32