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.
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.
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'
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.
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
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'
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.