2009-08-01 9 views
2

J'ai ces tableaux: Posts (poste, titre et texte), Tags (tag_id, tag), Post_tag_nn (id, tag_id, post_id). Je veux pour un poste spécifique ayant par exemple 4 tags tous les messages avec ces tags, puis tous les messages avec trois de ces tags, puis tous les messages avec deux de ces tags et ainsi de suite. Comment puis-je construire une requête SQL à cet effet (en php, il semble être un problème de retour arrière = tous les sous-ensembles d'un ensemble donné).trouver les messages liés par des balises avec un poste spécifique dans mysql

Répondre

6

avez une question de trouver les balises du poste actuel, quelque chose comme

SELECT tag_id 
FROM Post_tag_nn 
WHERE post_id = $post_id; 

Ensuite, en utilisant ces id tag de cette requête devrait vous renvoyer les id de messages avec 4,3,2, ... mots-clés correspondants:

SELECT post_id, COUNT(post_id) AS tag_count 
FROM Post_tag_nn 
WHERE tag_id IN ($array_of_tag_ids) 
GROUP BY post_id 
ORDER BY tag_count DESC; 
+0

Cela fonctionne. Je vous remercie! – Daniel

0

Si vous souhaitez extraire tous les articles avec une seule balise, il est préférable de ne lancer qu'une seule requête par balise pour extraire tous les articles avec cette balise, puis générer les ensembles vous-même.

+0

Je cherche une méthode SQL pour ce faire, quelque chose de plus efficace que le codage dur. – Daniel

0

Quelque chose comme:

select t.id, t.tag_id, p.post_id, p.title, p.text 
    from post_tag_nn as t, posts p 
    where p.id = t.post_id 
    order by t.id 

Et puis faire le groupe dans votre code. Vous pouvez bien sûr faire deux requêtes différentes, l'une vous permettant de déterminer l'ordre et le nombre de vos tags, et l'autre vous permettant de récupérer la publication de chaque tag.

Questions connexes