Вие сте на прав път с втория си опит, използвайки логическо AND/OR
групирания вместо CASE
, но ако искате предпочитате редът, съответстващ на cmp_brand
върху редове с празен cmp_brand
и очаквайте само един резултат обратно, структурирайте своя ORDER BY
за сортиране на непразния cmp_brand
първо и ограничете общия резултат до 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
Това работи, защото изразът cmp_brand <> ''
дава булево значение true/false
, което MySQL интерпретира като 1/0
. Низходящо сортиране на тези стойности принуждава непразните да сортират първо (1 преди 0).
Актуализация след коментари:
Тъй като имате възможността да върнете повече от един ред, не можете да разчитате на ORDER BY
. Вместо това можете да извършите LEFT JOIN
срещу същата маса. От едната страна съвпадайте с cmp_brand = ''
а от другата страна съответства на cmp_brand = '123_NIKE'
. Важно е да върнете thumb
колона от и двете страни на съединението.
Увийте това в подзаявка в FROM
клауза, тогава на най-високо ниво можете да използвате SELECT CASE
да предпочетете cmp_brand
ако не е празно.
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
- Ето пример, където 123_NIKE съвпада:http://sqlfiddle.com/#! 2/dfe228/31
- И пример, при който 124_NIKE не съвпада:http://sqlfiddle.com/# !2/dfe228/32