Jesteś na dobrej drodze przy drugiej próbie, używając logicznego AND/OR grupowanie zamiast CASE , ale jeśli chcesz preferować wiersz pasujący do cmp_brand nad wierszami z pustym cmp_brand i spodziewaj się tylko jednego wyniku, ustrukturyzuj swoje ORDER BY aby posortować niepuste cmp_brand najpierw i ogranicz ogólny wynik do 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
https://sqlfiddle.com/#!2/d176b/2
Działa to, ponieważ wyrażenie cmp_brand <> '' zwraca wartość logiczną true/false , który MySQL interpretuje jako 1/0 . Sortowanie malejące według tych wartości zmusza niepuste do sortowania od pierwszej (1 przed 0).
Aktualizacja po komentarzach:
Ponieważ masz możliwość zwrócenia więcej niż jednego wiersza, nie możesz polegać na ORDER BY . Zamiast tego możesz wykonać LEFT JOIN przeciwko tej samej tabeli. Z jednej strony dopasuj cmp_brand = '' a po drugiej stronie dopasuj cmp_brand = '123_NIKE' . Co ważne, zwróć thumb kolumna z obu boki połączenia.
Zapakuj to w podzapytanie w FROM klauzula, to na najwyższym poziomie możesz użyć SELECT CASE preferować cmp_brand jeśli nie jest pusty.
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
- Oto przykład dopasowania 123_NIKE:https://sqlfiddle.com/#! 2/dfe228/31
- I przykład, w którym 124_NIKE nie pasuje:https://sqlfiddle.com/# !2/dfe228/32