Mysql: comment sélectionner les groupes ayant certaines valeurs?
Dire qu'il y a une telle table:
mysql> SELECT * FROM tags;
+---------+--------+
| post_id | tag_id |
+---------+--------+
| 1 | 2 |
| 1 | 3 |
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
+---------+--------+
5 rows in set (0.00 sec)
Les noms de champ sont assez explicites. Je veux choisir post_id
s qui ont à la fois 1 et 3 tag_id
s, de sorte que dans cet exemple, c'est seulement 1
. J'ai pensé à quelque chose comme
SELECT post_id FROM tags GROUP BY post_id HAVING ...
Après avoir j'aimerais liste tag_id
s qui sont présents dans ce groupe. Comment dois-je faire?
OriginalL'auteur htf | 2010-06-21
Vous devez vous connecter pour publier un commentaire.
Si post_id et tag_id les deux ont une contrainte unique, qui devrait fonctionner:
Si il n'y a pas des contraintes uniques essayer:
SELECT post_id FROM tags WHERE tag_id IN (1,3) GROUP BY post_id HAVING COUNT(1) = 2;
, ce qui va bien et est le plus proche de votre solutionOriginalL'auteur rudi-moore
Vous pourriez essayer une auto-jointure (N tag_id -> N join), mais sans doute il n'est pas rapide
N'a pas vraiment d'échelle pour une quantité arbitraire de balises.
OriginalL'auteur Keeper
J'ai fait quelques hypothèses au sujet de vos autres tables. (c'est à dire que vous avez une table pour les postes que j'ai appelé
posts
et une avec tag_id que le psy que j'ai appelétag_table
pour éviter un nameclash avec les poteaux/tags tableau que je vous vois déjà appeltags
)Vous voulez des postes pour lesquels il n'existe pas une balise dans la liste {1,3} pour lesquels il n'existe pas un enregistrement correspondant avec le correspondant post_id/tag_id de sorte que vous pouvez utiliser un double n'EXISTE PAS construire comme ci-dessous.
Une autre approche alternative consiste à utiliser Group By et Compter. Un examen des approches à ce problème est ici.
OriginalL'auteur Martin Smith
Utilisation GROUP_CONCAT() pour la deuxième partie de votre question
OriginalL'auteur Mark Baker
Comment sur
OriginalL'auteur Chowlett
OÙ la version de @Gardien de la solution
hmm.. oui, vous avez raison - sera mise à jour
OriginalL'auteur Amarghosh