update - MySQL Multiple Where Clause
where mysql (6)
Tengo una mesa como esta:
id image_id style_id style_value
-----------------------------------
1 45 24 red
1 45 25 big
1 47 26 small
1 45 27 round
1 49 28 rect
Quiero tomar la columna image_id si:
-
style_id = 24
ystyle_value = red
-
style_id = 25
ystyle_value = big
-
style_id = 26
ystyle_value = round
He hecho una consulta como esta:
$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = ''red'') AND (style_id = 25 AND style_value = ''big'') AND (style_id = 27 AND style_value = ''round'')
Pero no pude obtener ningún resultado. Cuando hago esta muestra con OR, funciona bien. Pero tengo que hacer esto con AND. Porque necesito ID de imagen que sean "rojo, grande y correcto".
He hecho muchas búsquedas con Google pero no pude encontrar ninguna solución.
Gracias,
Ten un buen trabajo.
Creo que estás después de esto:
SELECT image_id
FROM list
WHERE (style_id, style_value) IN ((24,''red''),(25,''big''),(27,''round''))
GROUP BY image_id
HAVING count(distinct style_id, style_value)=3
No puede usar AND, ya que los valores no pueden ser 24 red
25 big
y 27 round
al mismo tiempo en la misma fila, pero debe verificar la presencia de style_id, style_value
en varias filas, bajo el mismo image_id
.
En esta consulta estoy usando IN (que, en este ejemplo particular, es equivalente a un OR), y estoy contando las distintas filas que coinciden. Si coinciden 3 filas distintas, significa que los 3 atributos están presentes para ese image_id
, y mi consulta lo devolverá.
Esto podría ser lo que está buscando, aunque dependiendo de la cantidad de style_id que haya, sería difícil de implementar (no estoy seguro de si esos style_id son estáticos o no). Si este es el caso, entonces no es realmente posible lo que está buscando, ya que la cláusula WHERE funciona de fila en fila.
WITH cte as (
SELECT
image_id,
max(decode(style_id,24,style_value)) AS style_colour,
max(decode(style_id,25,style_value)) AS style_size,
max(decode(style_id,27,style_value)) AS style_shape
FROM
list
GROUP BY
image_id
)
SELECT
image_id
FROM
cte
WHERE
style_colour = ''red''
and style_size = ''big''
and style_shape = ''round''
Nunca obtendrás un resultado, es un simple error lógico.
Le está pidiendo a su base de datos que devuelva una fila que tenga style_id = 24 AND style_id = 25 AND style_id = 26
. Dado que 24 es nieter 25 ni 26, no obtendrá ningún resultado.
Tienes que usar OR
, entonces tiene sentido.
Puede estar utilizando esta consulta que no obtiene ningún resultado o resultado vacío. Necesita usar OR
lugar de AND
en su consulta como se muestra a continuación.
$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = ''red'') OR (style_id = 25 AND style_value = ''big'') OR (style_id = 27 AND style_value = ''round'');
Pruebe esta consulta.
SELECT a.image_id
FROM list a
INNER JOIN list b
ON a.image_id = b.image_id
AND b.style_id = 25
AND b.style_value = ''big''
INNER JOIN list c
ON a.image_id = c.image_id
AND c.style_id = 27
AND c.style_value = ''round''
WHERE a.style_id = 24
AND a.style_value = ''red''
select unique red24.image_id from
(
select image_id from `list` where style_id = 24 and style_value = ''red''
) red24
inner join
(
select image_id from `list` where style_id = 25 and style_value = ''big''
) big25
on red24.image_id = big25.image_id
inner join
(
select image_id from `list` where style_id = 27 and style_value = ''round''
) round27
on red24.image_id = round27.image_id