Du er på rette vej med dit andet forsøg ved at bruge logiske AND/OR
grupperinger i stedet for en CASE
, men hvis du vil foretrække rækken, der matcher cmp_brand
over rækker med et tomt cmp_brand
og forvent kun ét resultat tilbage, strukturer din ORDER BY
for at sortere det ikke-tomme cmp_brand
først, og begrænse det samlede resultat til 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
Dette virker, fordi udtrykket cmp_brand <> ''
evalueres til den boolske true/false
, som MySQL fortolker som 1/0
. En faldende sortering på disse værdier tvinger de ikke-tomme til at sortere (1 før 0).
Opdatering efter kommentarer:
Da du har mulighed for at returnere mere end én række, kan du ikke stole på ORDER BY
. I stedet kan du udføre en LEFT JOIN
mod samme bord. På den ene side skal du matche cmp_brand = ''
og på den anden side matcher cmp_brand = '123_NIKE'
. Det er vigtigt, at returnere thumb
kolonne fra begge sider af sammenføjningen.
Pak det ind i en underforespørgsel i FROM
klausul, så på øverste niveau kan du bruge en SELECT CASE
at foretrække cmp_brand
hvis den ikke er tom.
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
- Her er et eksempel, hvor 123_NIKE matcher:http://sqlfiddle.com/#! 2/dfe228/31
- Og et eksempel, hvor 124_NIKE ikke matcher:http://sqlfiddle.com/# !2/dfe228/32