8
votes

MySQL: Comment sélectionner des groupes ayant certaines valeurs?

Disons qu'il existe une telle table: xxx

Les noms de champ sont assez explicités. Je veux sélectionner post_id s qui ont les deux 1 et 3 tag_id s, donc dans cet exemple, il n'est que 1 . J'ai pensé à quelque chose comme Sélectionnez Post_ID à partir de Tags Group par Post_Id Avoir ... Après avoir voulu répertorier tag_id s présent dans ce groupe. Comment puis-je faire ça?


0 commentaires

6 Réponses :


1
votes

J'ai fait des hypothèses sur vos autres tables. (c.-à-d. que vous avez une table pour les messages que j'ai appelé messages et un avec tag_id comme la PK que j'ai appelé tag_table pour éviter une nameclash avec la table des poteaux / Tags que je peux vous voir déjà appeler tags )

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

Une autre approche alternative consiste à utiliser le groupe et compter. a Examen des approches de ce problème est ici ici .


0 commentaires

3
votes

Vous pouvez essayer un auto rejoindre (N tag_id -> N rejoindre) mais probablement ce n'est pas rapide xxx


1 commentaires

N'a-t-elle pas vraiment échelle pour une quantité arbitraire de tags cependant.



0
votes

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)
  );


1 commentaires

Cette réponse manque à son explication éducative.



0
votes

où la version de la solution @ Keeper xxx


1 commentaires

Ne pensez pas que la deuxième clause de votre ou est utile.



2
votes
SELECT post_id,
       GROUP_CONCAT(tag_id ORDER BY tag_id ASC SEPARATOR ',')
  FROM tags

0 commentaires

12
votes

S'il n'y a pas de contraintes uniques, essayez: xxx pré>

ou utilisez ce ayant la clause code>, si vous essayez de net détecter que deux tag_id code > Valeurs: p> xxx pré>

si post_id et tag_id ont les deux une contrainte unique, cela devrait fonctionner aussi: P>

SELECT post_id 
FROM tags 
WHERE tag_id = 1 OR tag_id = 3 
GROUP BY post_id 
HAVING count(*) = 2;


1 commentaires

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; , qui échelle bien et est le plus proche de votre solution