Disons qu'il existe une telle table: Les noms de champ sont assez explicités. Je veux sélectionner post_id code> s qui ont les deux 1 et 3
tag_id code> s, donc dans cet exemple, il n'est que
1 code>. J'ai pensé à quelque chose comme
Sélectionnez Post_ID à partir de Tags Group par Post_Id Avoir ... Code> Après avoir voulu répertorier
tag_id code> s présent dans ce groupe. Comment puis-je faire ça? P> p>
6 Réponses :
J'ai fait des hypothèses sur vos autres tables. (c.-à-d. que vous avez une table pour les messages que j'ai appelé Vous voulez des messages où il n'existe pas une balise dans la liste {1,3} pour laquelle il n'existe pas d'enregistrement correspondant avec le post_id correspondant / tag_id afin que vous puissiez utiliser un double n'existe pas de construction comme ci-dessous. p> Une autre approche alternative consiste à utiliser le groupe et compter. a Examen des approches de ce problème est ici ici . p> p> messages code> et un avec tag_id comme la PK que j'ai appelé
tag_table code> pour éviter une nameclash avec la table des poteaux / Tags que je peux vous voir déjà appeler
tags code>)
Vous pouvez essayer un auto rejoindre (N tag_id -> N rejoindre) mais probablement ce n'est pas rapide
N'a-t-elle pas vraiment échelle pour une quantité arbitraire de tags cependant.
Que diriez-vous de
SELECT * FROM tags WHERE post_id in (SELECT post_id AS pid FROM tags WHERE 1 IN (SELECT tag_id FROM tags WHERE post_id = pid) AND 3 IN (SELECT tag_id FROM tags WHERE post_id = pid) );
Cette réponse manque à son explication éducative.
où la version de la solution @ Keeper
Ne pensez pas que la deuxième clause de votre ou est utile.
SELECT post_id, GROUP_CONCAT(tag_id ORDER BY tag_id ASC SEPARATOR ',') FROM tags
S'il n'y a pas de contraintes uniques, essayez: ou utilisez ce si post_id et tag_id ont les deux une contrainte unique, cela devrait fonctionner aussi: P> ayant la clause code>, si vous essayez de net détecter que deux
tag_id code > Valeurs: p>
SELECT post_id
FROM tags
WHERE tag_id = 1 OR tag_id = 3
GROUP BY post_id
HAVING count(*) = 2;
Merci, j'ai décidé d'aller avec Sélectionner post_id à partir des balises où Tag_Id in (1,3) groupe par post_id comptez le comptage (1) = 2; code>, qui échelle bien et est le plus proche de votre solution