Blog Datenbank - Ähnliche Beiträge auslesen
Bis eben gerade habe ich mich mal wieder sehr intensiv mit SQL Abfragen beschäftigt, und einen Weg gefunden diesen ganzen "Ähnliche Artikel" Kram mit einem einzigen Query auszulesen. ![]()
Auf http://dev.mysql.com bin ich auf zwei sehr interessante Features gestoßen, die ich bis jetzt noch nicht kannte. Und zwar die Funktion GOURP_CONCAT() und den Operator IN.
Hier erst mal das komplette Statement. Die beiden Features sind orange markiert.
SELECT entry_id, title, GROUP_CONCAT(tag_name ORDER BY tag_name ASC SEPARATOR ', ') AS tags FROM content_tags LEFT JOIN content ON fk_entry_id=entry_id LEFT JOIN tags ON tag_id=fk_tag_id WHERE tag_id IN (
SELECT
tag_id
FROM
content_tags
LEFT JOIN tags ON fk_tag_id=tag_id
WHERE
fk_entry_id='83'
) AND fk_entry_id!='83' GROUP BY entry_id ORDER BY COUNT(tag_id) DESC, content.create_date DESC LIMIT 0,5
Mit der Funktion GROUP_CONCAT() ist es dabei möglich, Gruppierungen in eine Spalte zu verschmelzen. So kann man alle Tags die die Artikel gemeinsam haben mit Komma getrennt ausgeben lassen, und muss diese nicht noch mit einem weiteren Query auslesen.
Mit dem Operator IN kann man eine Spalte mit einem Subquery vergleichen. » Gib nur Datensätze aus, wo sich der Wert der Spalte in dem Result des Subquerys befindet. « So vermeidet man "or id=12 or id=45 or id=67 or..." Konstrukte, und es werden alle Artikel ausgelesen, die mindestens über ein gleiches Tag mit dem aktiven Artikel verwandt sind.
Den IN Operator kannte ich zwar schon aus MSSQL, war aber der festen Überzeugung dass MySQL den nicht kann. Keine Ahnung wie ich darauf gekommen bin...
Verwandte Beiträge
- MySQL Groß- und Kleinschreibung (Datenbanken, MySQL, Programmieren)
- MySQL - Doppelte Datensätze abfangen (Datenbanken, MySQL, Programmieren)
- In einem MySQL Query select und update/insert (Datenbanken, MySQL)
- MySQL Dumpfiles verketten (Datenbanken, MySQL)
- Neue Domain für alten Blog (Blog v2.0, Programmieren)






