web-dev-qa-db-fra.com

MySQL Join avec plusieurs conditions

J'ai un problème avec une requête SQL, en fait une requête simple mais je ne peux pas comprendre ce qui me manque, alors je suis venu vous demander votre aide ... Alors, ce que je dois faire

J'ai deux tables rooms et rooms facilities... et je dois sélectionner les chambres avec les équipements souhaités ..

Si je sélectionne une pièce avec une installation (installation avec id = 4 - id_fu -) ... en utilisant la requête suivante

SELECT u.* FROM rooms u 
JOIN facilities_r fu 
ON fu.id_uc = u.id_uc 
    AND fu.id_fu = '4' 
WHERE 1 
    AND vizibility='1' 
GROUP BY id_uc 
ORDER BY u_premium desc, id_uc DESC 

tout va bien.

Mais si je veux sélectionner la pièce avec plus de facilités, disons des installations avec id = 4 et id = 3 .. en utilisant la requête suivante

SELECT u.* FROM room u 
JOIN facilities_r fu 
ON fu.id_uc=u.id_uc 
    AND fu.id_fu = '4' 
    AND fu.id_fu = '3' 
WHERE 1 
    AND vizibility = '1' 
GROUP BY id_uc 
ORDER BY u_premium DESC, id_uc DESC 

ça ne marche pas.

Je ne comprends pas pourquoi ça ne marche pas, mais je ne vois pas comment poser la question ...

Merci Mihai

55
Mihai Stancioiu

Vous pouvez regrouper les conditions avec des parenthèses. Lorsque vous vérifiez si un champ est égal à un autre, vous souhaitez utiliser OR. Par exemple, WHERE a='1' AND (b='123' OR b='234').

SELECT u.*
FROM rooms AS u
JOIN facilities_r AS fu
ON fu.id_uc = u.id_uc AND (fu.id_fu='4' OR fu.id_fu='3')
WHERE vizibility='1'
GROUP BY id_uc
ORDER BY u_premium desc, id_uc desc
70
DesignerGuy
SELECT 
    u . *
FROM
    room u
        JOIN
    facilities_r fu ON fu.id_uc = u.id_uc
        AND (fu.id_fu = '4' OR fu.id_fu = '3')
WHERE
    1 and vizibility = '1'
GROUP BY id_uc
ORDER BY u_premium desc , id_uc desc

Vous devez utiliser OR ici, pas AND.

Depuis id_fu ne peut pas être égal à 4 et 3, les deux à la fois.

12
Ananth

Si vous rejoignez la table des installations à deux reprises, vous obtiendrez ce que vous recherchez:

select u.* 
from room u 
  JOIN facilities_r fu1 on fu1.id_uc = u.id_uc and fu1.id_fu = '4'
  JOIN facilities_r fu2 on fu2.id_uc = u.id_uc and fu2.id_fu = '3' 
where 1 and vizibility='1' 
group by id_uc 
order by u_premium desc, id_uc desc
6
Andy Hobbs