web-dev-qa-db-fra.com

MySQL Multiple Clause Où

J'ai une table comme celle-ci:

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

Je veux prendre la colonne image_id si:

  • style_id = 24 et style_value = red
  • style_id = 25 et style_value = big
  • style_id = 26 et style_value = round

J'ai faire une requête comme ceci:

$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')

Mais je n'ai pu obtenir aucun résultat. Quand je fais cet échantillon avec OU, cela fonctionne bien. Mais je dois le faire avec AND. Parce que j’ai besoin d’identificateurs d’image qui sont à la fois "rouge, grand et droit".

J'ai effectué de nombreuses recherches avec Google, mais je ne pouvais trouver aucune solution.

Merci,

Bon travail.

25
Bugra YUKSEL

Je pense que vous êtes après ceci:

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

Vous ne pouvez pas utiliser AND, car les valeurs ne peuvent pas être 24 red et 25 big et 27 round en même temps sur la même ligne, mais vous devez vérifier la présence de style_id, style_value sur plusieurs lignes, sous le même image_id.

Dans cette requête, j'utilise IN (qui, dans cet exemple particulier, équivaut à un OR), et je compte les lignes distinctes qui correspondent. Si 3 lignes distinctes correspondent, cela signifie que les 3 attributs sont présents pour ce image_id, et ma requête le renverra.

39
fthiella
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'
9
bobwienholt

Vous n'obtiendrez jamais de résultat, c'est une simple erreur de logique. 

Vous demandez à votre base de données de renvoyer une ligne qui a style_id = 24 AND style_id = 25 AND style_id = 26. Puisque 24 est niether 25 ni 26, vous n'obtiendrez aucun résultat.

Vous devez utiliser OR, alors cela a du sens.

7
akashivskyy
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
1

C’est peut-être ce que vous recherchez, bien que selon le nombre de style_id, il serait difficile de la mettre en œuvre (vous ne savez pas si ces identificateurs sont statiques ou non) Si tel est le cas, il n’est pas vraiment possible de savoir ce que vous voulez, car la clause WHERE fonctionne ligne par ligne.

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

1
Lock

Peut-être en utilisant cette requête vous n'obtenez aucun résultat ou résultat vide. Vous devez utiliser OR au lieu de AND dans votre requête, comme ci-dessous.

$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');

Essayez cette requête.

0
Ajay Gupta