2010-08-31 4 views
0

J'ai deux tables qui sont liées, qui, dans le cadre de cette question, seront appelées posts et tags. posts contient diverses publications, telles que celles trouvées sur un système de forum communautaire. tags contient un ensemble unique de balises, qui sont ajoutées lorsque le serveur rencontre une nouvelle balise qui n'est pas déjà dans le système. Il n'y a qu'une seule entrée par tag.Plusieurs à plusieurs Tableau SQL Sélection Problème

posts peut avoir plusieurs balises, et tags peut avoir plus d'un poste qui fait référence à celui-ci. Pour gérer ces références d'avant en arrière, j'ai créé une table pour s'asseoir entre ces deux tables, appelé posttags. posttags contient une référence à l'ID tag et l'ID post. C'est ainsi que la relation de plusieurs à plusieurs est maintenue.

Maintenant, sur le problème. Je dois être en mesure de sélectionner les messages en fonction d'un tag. C'est une jointure simple quand il n'y a qu'une seule balise à rechercher, mais je ne sais pas comment gérer plusieurs balises. Par exemple, je dois être capable de rechercher dans la base de données et obtenir des résultats qui ont TOUS les tags qui sont dans une liste (par exemple, "php, mysql, sql"), sans utiliser SQL dans une boucle ou toute autre basse performance options

Je ne suis pas sûr de savoir comment faire. Quelqu'un peut-il me pointer dans la bonne direction?

Merci!

Répondre

3

Vous pouvez utiliser l'approche suivante, 3 est la quantité d'étiquettes demandées.

SELECT PostId 
FROM posttags pt, tags t 
WHERE p.Id = pt.PostId 
    AND t.Id = pt.TagId 
    AND tagname In ('php', 'mysql', 'sql') 
group by PostId 
having count(*) = 3 

ou vous pouvez trier les balises que vous avez demandé les rejoindre et pour utiliser les éléments suivants:

Select * from Posts p, 
( 
SELECT PostId, GROUP_CONCAT(tagname ORDER BY tag_name DESC SEPARATOR ' ') Tags 
FROM posttags pt, tags t 
WHERE p.Id = pt.PostId 
    AND t.Id = pt.TagId 
GROUP BY PostId 

) t OÙ t.PostId = p.Id ET t.Tags = « php mysql sql »

Mais vous devez trier vos balises

+0

Génial, ça marche! Je vous remercie. –

1

Si vous voulez sélectionner les messages qui ont tous balises dans un ensemble donné, vous pouvez utiliser une stratégie « comptage »:

SELECT 
    p.* 
FROM tags t 
LEFT JOIN posttags pt 
    ON pt.tag_id = t.tag_id 
LEFT JOIN posts p 
    ON p.post_id = pt.post_id 
WHERE 
    tags.tag IN ('php', 'mysql', 'sql') 
GROUP BY p.post_id 
HAVING COUNT(tags.tag_id) = 3; 

Bien sûr, si vous changez le jeu, doit être changé le nombre « 3 » au nombre d'éléments dans l'ensemble.

+0

Bonne réponse. Vous et Micheal avez tous deux répondu au même genre de chose, alors j'ai dû donner la bonne réponse à Micheal depuis qu'il a répondu en premier. Cependant, merci d'expliquer ce que la requête a fait! –

Questions connexes