Estás en el camino correcto con tu segundo intento, usando AND/OR
lógico agrupaciones en lugar de un CASE
, pero si quieres preferir la fila que coincide con cmp_brand
sobre filas con un cmp_brand
vacío y espera solo un resultado, estructura tu ORDER BY
para ordenar el cmp_brand
no vacío primero, y limite el resultado general 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
Esto funciona porque la expresión cmp_brand <> ''
evalúa al booleano true/false
, que MySQL interpreta como 1/0
. Una ordenación descendente en esos valores obliga a los que no están vacíos a ordenar primero (1 antes de 0).
Actualizar después de los comentarios:
Dado que tiene la posibilidad de que se devuelva más de una fila, no puede confiar en ORDER BY
. En su lugar, puede realizar un LEFT JOIN
contra la misma mesa. Por un lado, haga coincidir cmp_brand = ''
y en el otro lado coincide con cmp_brand = '123_NIKE'
. Es importante destacar que devuelve el thumb
columna de ambos lados de la unión.
Envuelva eso en una subconsulta en FROM
cláusula, luego en el nivel superior puede usar un SELECT CASE
preferir el cmp_brand
si no está vacío.
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
- Este es un ejemplo donde 123_NIKE coincide:http://sqlfiddle.com/#! 2/dfe228/31
- Y un ejemplo donde 124_NIKE no coincide:http://sqlfiddle.com/# !2/dfe228/32