2009-08-01 9 views
2

Ich habe diese Tabellen: Beiträge (post_is, Titel und Text), Tags (tag_id, Tag), Post_tag_nn (id, tag_id, post_id). Ich möchte für einen bestimmten Beitrag zum Beispiel 4 Tags alle Beiträge mit diesen Tags, dann alle Beiträge mit drei dieser Tags, dann alle Beiträge mit zwei dieser Tags und so weiter. Wie kann ich eine SQL-Abfrage für diesen Zweck erstellen (in PHP scheint es wie ein Backtracking-Problem = alle Teilmengen einer bestimmten Menge).Finden Sie die Beiträge durch Tags mit einem bestimmten Beitrag in Mysql

Antwort

6

Haben Sie eine Abfrage, um die Tags des aktuellen Beitrag zu finden, so etwas wie

SELECT tag_id 
FROM Post_tag_nn 
WHERE post_id = $post_id; 

Dann diese Tag-IDs verwenden, diese Abfrage sollten Sie die IDs der Beiträge mit 4,3,2 zurückkehren, ... Passende Tags:

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

Es funktioniert. Vielen Dank! – Daniel

0

Wenn Sie jeden Beitrag mit nur einem einzigen der Tags abrufen möchten, sollten Sie am besten eine einzige Abfrage pro Tag ausführen, um alle Posts mit diesem Tag zu erfassen und dann zu generieren Das setzt sich selbst.

+0

Ich bin auf der Suche nach einer SQL-Methode, um dies zu tun, etwas effizienter als nur harte Codierung. – Daniel

0

Etwas wie:

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 

Und dann tun die Gruppe in Ihrem Code. Sie können natürlich zwei verschiedene Abfragen ausführen, eine, bei der Sie die Reihenfolge und Anzahl Ihrer Tags herausfinden und dann eine, bei der Sie den Post für jedes Tag zurückziehen.

Verwandte Themen