IN clause

grab all tags :)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, J'ai un problème de logique avec MySQL et la clause in : J'ai un système de tags rattacher un un objet x ( ManyToMAny) que je filtres via ces tags. Pas de problèmes ça marche. Le hic, c'est qu'il me récupérer un tag (ou les tags) sur lequel je base mon filtre. Logique ! Mais je veux récupéré tous mes tags qui sont liée à x et pas seulement celui sur lequel je filtre.

1
SELCT * FROM x LEFT JOIN Tag t on t.id = x.tag_id WHERE t.id IN (5)

Imaginons que x a les tags : 1,2,3,4 et 5, je me retrouve donc donc avec le tag 5 seulement, mais moi je les veux tous. Pourquoi ? Parce que !!!!!!:p

Une petit idées pour récupérer tous les enregistrement liée de cette façon ?

Merci de votre aide (et explication sur la logique à appliquer)

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -0

Tu dois préciser le nombre de tag que tu sélectionnes avec Having. ;)

1
2
3
4
5
6
SELECT *
FROM x
LEFT JOIN Tag t on t.id = x.tag_id
WHERE t.id IN (1, 2, 3, 4, 5)
GROUP BY Tag.id
HAVING COUNT(*) = 5

Édité par A-312

+0 -0
Auteur du sujet

tester, mais pas approuvé . :( Ou j'ai pas compris un truc !

1
SELCT * FROM x LEFT JOIN Tag t on t.id = x.tag_id WHERE t.id IN (5) HAVING COUNT(*) = 5

?

Édité par darkiron

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -0

Cette réponse a aidé l'auteur du sujet

Salut !

Le souci que tu as je pense, c'est que tu fais un LEFT JOIN, donc tu mets le poids sur la table X, et non sur les tags. Donc tu récupèreras tous les X, mais avec tous leurs tags, pas tous les tags.

Comme il n'est pas possible de faire un RIGHT JOIN avec Doctrine (parce que la partie à droite peut être nulle), il te faudrait partir de l'entité TAG et récupérer avec LEFT JOIN les X liés. Pas forcément pratique, mais je ne vois pas d'autre possibilité.

Edit

Ouais, mais non.

Tu peux éventuellement joindre deux fois sur la même liaison, une fois pour "filtrer", une fois pour récupérer les tags liés.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+1 -0

Dans ton IN(?, ?, ?) tu mets les id des tags que tu souhaites sélectionnés, ensuite dans HAVING le nombre de tag que tu as dans ton IN.

1
SELECT * FROM x LEFT JOIN Tag t on t.id = x.tag_id WHERE t.id IN (5) HAVING COUNT(*) = 1

Édité par A-312

+0 -0
Auteur du sujet

Le solution la plus simple est de re-joindre les tables avec comme condition no in pour la deuxième jointure. Merci, Ymox.

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte