Je bent op de goede weg met je tweede poging, met behulp van logische AND/OR
groeperingen in plaats van een CASE
, maar als u de voorkeur geeft aan de rij die overeenkomt met cmp_brand
over rijen met een lege cmp_brand
en verwacht slechts één resultaat terug, structureer uw ORDER BY
om de niet-lege cmp_brand
. te sorteren en beperk het totale resultaat tot 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
Dit werkt omdat de uitdrukking cmp_brand <> ''
evalueert tot de boolean true/false
, die MySQL interpreteert als 1/0
. Een aflopende sortering op die waarden dwingt de niet-lege om eerst te sorteren (1 voor 0).
Update na opmerkingen:
Aangezien u de mogelijkheid heeft dat er meer dan één rij wordt geretourneerd, kunt u niet vertrouwen op de ORDER BY
. In plaats daarvan kunt u een LEFT JOIN
. uitvoeren tegen dezelfde tafel. Zoek aan de ene kant cmp_brand = ''
en aan de andere kant overeenkomen met cmp_brand = '123_NIKE'
. Belangrijk is dat u de thumb
return teruggeeft kolom van beide zijkanten van de join.
Wikkel dat in een subquery in de FROM
clausule, dan kun je op het hoogste niveau een SELECT CASE
. gebruiken om de voorkeur te geven aan de cmp_brand
indien niet leeg.
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
- Hier is een voorbeeld waarin 123_NIKE overeenkomt:http://sqlfiddle.com/#! 2/dfe228/31
- En een voorbeeld waarbij 124_NIKE niet overeenkomt:http://sqlfiddle.com/# !2/dfe228/32