MySQL - News + Kommentare in einer Query?

String

Erfahrenes Mitglied
Huhu zusammen,

ich habe lange gegoogled und gesucht. Leider ohne Erfolg.

Gibt es eine Möglichkeit, Beiträge + Kommentare zu den Beiträgen in einer Query zu "laden"?

Als Beispiel: Die Admins schreiben News, diese können kommentiert werden.
Wenn ich nun 30 News anzeige, habe ich schonmal 30 Queries, da ich in jeder News ja die x-Anzahl an Kommentaren laden muss.

Ist irgendwie unschön, aber gibt es da was besseres?

Gruß
paD
 
30 Queries?
Dann machst du da schon was ziemlich falsch. Da ich aber nicht sehe was du machst, kann ich dir auch nicht sagen was du zu kompliziert löst
 
Huhu,

wie gesagt, im Prinzip ist das System relativ einfach:

Tabelle News:
id, titel, text

Tabelle News_Kommentare
id, newsid, text

PHP:
$q = "SELECT * FROM news";
$query = mysql_query($q);

while($news = mysql_fetch_assoc($query)) {

$qComments = "SELECT * FROM news_kommentare WHERE newsid = {$news['id']}";
$kommentare = mysql_query($qComments);

echo 'News, bla bla, Kommentare:'

while($kommentare = mysql_fetch_assoc($kommentare)) {
   echo 'Kommentare bla bla';
}
}

Natürlich nur "schemenhaft" dargestellt. ;)

paD
 
Ein Tip am Rande: Code formatieren.

Ich würde die Kommentare Cachen. Dann hast du nur einen DB-Zugriff für die Komentare
PHP:
//Alle Kommentare auslesen
$sqlComments = 'SELECT * FROM news_kommentare';
$result = mysql_query($sqlComments);
while($comment = mysql_fetch_assoc($result)){
	$comments[$comment['newsid']][] = $comment;
}

//Die News auslesen
$sqlNews = 'SELECT * FROM news';
$result = mysql_query($sqlNews);
while($news = mysql_fetch_assoc($result)){
	echo "<h4>{$news['title']}</h4>";
	//Und pro News die Kommentare
	foreach($comments[$news['id']] as $comment){
		echo "<p>{$comment['text']}</p>";
	}
}
 
Ja, das mit dem Formatieren hier ist so ne Sache. Tabulator funktioniert leider nicht, mit Leerzeichen ist das ein ganz schöner Kampf.

Okay. Aber wenn man irgendwann 30.000 News und 100.000 Kommentare hat, ist das doch so bestimmt weniger Sinnvoll oder?

Wie würdest du dann vorgehen?
Also gehen wir davon aus, wir wollen die fünfzig neuesten News auf einer Seite anzeigen und jeweils die letzten 10 passenden Kommentare dazu.

Gruß
paD
 
Für Seitenweises Anzeigen sind Limit und Offset deine Freunde.
Für die letzten 50 News kannst u zB schreiben:

ORDER BY `id` DESC LIMIT 50

Ist jetzt auf die ID bezogen. Geht natürlich schöner auchnoch wenn man ein Datumsfeld oÄ hat ;)
 
Huhu,

ja klar. Das ist alles kein Problem. Seitenweise / Blättern habe ich schon des öfteren programmiert.

Und genau diese von dir erwähnte Verknüpfung der Kommentare mit einem INNER JOIN, verstehe ich nicht / bekomme ich nicht hin.

Die Frage ist nach wie vor: Wie bekomme ich zu einem Datensatz x passende aus einer anderen Tabelle, ohne diese in einer Schleifen ständig abfragen zu müssen.

Ich könnte ein LEFT JOIN mit den IDs machen ja, aber das / die Ergebnisse kann ich kaum auswerten.
Ich erhalte bei
PHP:
 SELECT * FROM news LEFT JOIN news_kommentare ON news.id = news_kommentare.id

Eine Zeile pro News, und jede Menge Kommentare. Aber die Kommentare sind überall mit NULL gefüllt, wo die News Einträge in den Spalten habt.
Ist relativ schwer zu erklären was ich meine.. :/

Und genau da hänge ich ;)
 
Der' SELECT *' ist gaaaanz schlecht. Du hast mehrfach die Spalte die du ausgibst.

Und bist du sicher, dass news_kommentare.id die ID der News und nicht die der Kommentare ist?
 
Das * war jetzt auch nur ein Beispiel. Und ja, die ID ist wirklich die falsche. Es sollte natürlich die news_kommentare.news_id sein.

Quasi:
PHP:
SELECT {$meineFelder} FROM news LEFT JOIN news_kommentare ON news.id = news_kommentare.news_id

Dann erhalte ich halt die News so oft "doppelt" wie es auch kommentare dazu gibt. INNER oder RIGHT Join, liefern natürlich nur Ergebnisse, wenn in beiden Tabellen etwas vorhanden ist.

Da bleiben mir nur die Queries in den schleifen...?

paD
 
Zurück