Você está no caminho certo com sua segunda tentativa, usando a lógica
AND/OR
agrupamentos em vez de um CASE
, mas se você quiser preferir a linha correspondente a cmp_brand
sobre as linhas com um cmp_brand
vazio e esperar apenas um resultado de volta, estruture seu ORDER BY
para classificar o cmp_brand
não vazio primeiro e limite o resultado geral a 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
Isso funciona porque a expressão
cmp_brand <> ''
avalia para o booleano true/false
, que o MySQL interpreta como 1/0
. Uma classificação decrescente nesses valores força os não vazios a classificar primeiro (1 antes de 0). Atualização após comentários:
Como você tem a possibilidade de mais de uma linha ser retornada, você não pode confiar no
ORDER BY
. Em vez disso, você pode executar um LEFT JOIN
contra a mesma mesa. De um lado, combine cmp_brand = ''
e do outro lado corresponde a cmp_brand = '123_NIKE'
. Importante, retorne o thumb
coluna de ambos lados da junção. Envolva isso em uma subconsulta no
FROM
cláusula, então no nível superior você pode usar um SELECT CASE
preferir o cmp_brand
se não estiver vazio. 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
- Aqui está um exemplo em que 123_NIKE corresponde:http://sqlfiddle.com/#! 2/dfe228/31
- E um exemplo em que 124_NIKE não corresponde:http://sqlfiddle.com/# !2/dfe228/32