values update not multiple conditions mysql sql where-clause

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 y style_value = red
  • style_id = 25 y style_value = big
  • style_id = 26 y style_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''

http://sqlfiddle.com/#!4/fa5cf/18


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