dedlfix: Geht das mit MySQL JOINS?

Beitrag lesen

echo $begrüßung;

Kann ich gleichzeitig die News und alle Links (und alle Kommentare) mit einer Datenbankanfrage herausholen?

Die Vorschläge, News und Links miteinander zu verjoinen, halte ich nicht für besonders hübsch.

Da es zu jeden News unterschiedlich viele Links geben kann [...]

... enthält das Ergebnis dann für jeden Link auch die zugehörige News. Das heißt, bei 5 Links zur News hast du die News fünfmal im Ergebnis. Für jede News eine eigene Abfrage nach den Links zu starten, ist auch nicht besonders ressourcenschonend. Zwei Vorschläge hätte ich im Angebot:

Wenn sich die Anzahl der abgefragten News im Rahmen hält, könnte eine zweite Abfrage mit WHERE ID_News IN (..., ..., ...) die zugehörigen Links ermitteln. Du müsstest dann bei Abfragen der Ergebnisdatensätze selbige anhand der News-ID den News zuordnen.

GROUP_CONCAT() (nicht in allen MySQL-Versionen verfügbar) verknüpft die durch die Gruppierung zusammengefassten Werte zu einem String, den man sich in der abfragenden Umgebung (z.B. PHP) am selbst gewählten Separator wieder aufsplitten lassen kann.

SELECT ID, Text, GROUP_CONCAT(Links.Link SEPARATOR '||') AS Links  
FROM News  
  LEFT JOIN Links ON News.ID = Links.ID_News  
GROUP BY News.ID

Normalerweise sollen bei gruppierten Abfragen außer Aggregatfunktionen nur die in der Gruppierungsbedingung angegebenen Spalten in der SELECT-Klausel auftauchen, da mitunter nicht entschieden werden kann, welcher der Datensätze pro Gruppe nun ausgegeben werden soll. Andere Systeme schränken das dementsprechend ein, MySQL jedoch nicht (hat aber eine entsprechende Warnung im Handbuch stehen). In unserem Fall ist durch die Gruppierungsbedingung News.ID und einen eindeutigen Index auf diesem Feld sichergestellt, dass nur ein Datensatz pro Gruppe existiert. Wir können hier also die Freizügigkeit MySQLs ohne Nebenwirkungen nutzen.

Als Separator wählte ich ||. Es kann aber auch jede beliebige andere Zeichenfolge sein, von der anzunehmen ist, dass sie nicht innerhalb eines Links auftaucht. An diesem Separator kann man die Links wieder trennen. PHP: explode('||', $links) Python: links.split('||') usw.

echo "$verabschiedung $name";