Beim zweiten Versuch mit dem logischen AND/OR
sind Sie auf dem richtigen Weg Gruppierungen anstelle eines CASE
, aber wenn Sie bevorzugen möchten die Zeile, die cmp_brand
entspricht über Zeilen mit einem leeren cmp_brand
und nur ein Ergebnis zurück erwarten, strukturieren Sie Ihr ORDER BY
um den nicht leeren cmp_brand
zu sortieren zuerst und begrenzen Sie das Gesamtergebnis auf 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
Das funktioniert, weil der Ausdruck cmp_brand <> ''
wertet den booleschen Wert true/false
aus , die MySQL als 1/0
interpretiert . Eine absteigende Sortierung nach diesen Werten zwingt die nicht leeren, zuerst zu sortieren (1 vor 0).
Update nach Kommentaren:
Da Sie die Möglichkeit haben, dass mehr als eine Zeile zurückgegeben wird, können Sie sich nicht auf ORDER BY
verlassen . Stattdessen können Sie einen LEFT JOIN
ausführen gegen denselben Tisch. Passen Sie auf der einen Seite cmp_brand = ''
an und auf der anderen Seite übereinstimmen cmp_brand = '123_NIKE'
. Geben Sie unbedingt den thumb
zurück Spalte von beiden Seiten der Verbindung.
Schließen Sie das in eine Unterabfrage im FROM
ein -Klausel, dann können Sie auf der obersten Ebene einen SELECT CASE
verwenden um cmp_brand
zu bevorzugen falls nicht leer.
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 ist ein Beispiel, in dem 123_NIKE übereinstimmt:http://sqlfiddle.com/#! 2/dfe228/31
- Und ein Beispiel, wo 124_NIKE nicht übereinstimmt:http://sqlfiddle.com/# !2/dfe228/32