Mysql - Join mit Count
Bastian Schnitzler
- datenbank
Hallo!
Ich habe ein Newsscript, das in einer Tabelle alle Informationen ueber die News sammelt und in einer zweiten Kommentare zu diesen News sammelt. Auf der Newsstartseite moechte ich nun aber auch die Anzahl der jeweiligen Kommentare anzeigen, ich zeige auf jeder Seite eine Feste Anzahl von News an und mithilfe einer Zahlenleiste kann man dann zur jeweiligen Seite mit aelteren News springen.
Das Problem ergibt sich beim Feststellen der Kommentarzahlen zur jeweiligen News, ich moechte dies Moeglichst in einer Abfrage behandeln.
Benutze ich z.B.
SELECT title, count(*) as ZahlderKommentare from news LEFT JOIN kommentare on kommentare.kid = news.newsid GROUP BY newsid LIMIT 1, 6
bekomme ich bei einer Kommentaranzahlen von >= 2 die richtige Anzahl, ansonsten 1 (auch fuer News mit einer Anzahl von 0 Kommentaren). Hierbei benutze ich LIMIT um nur die News fuer die jeweilige Seite abzurufen, ich fange mit der 1. News an und waehle von dortaus 5 weitere aus.
Ich koennte fuer jede News eine extra Datenbankabfrage machen, das waeren jedoch bei einer Anzahl von 6 News pro Seite weitere 6 News.
Ich habe auch schon mit einer Vereinigung von zwei Selects rumgespielt, mittels UNION, aber dann bekomme ich die Eintraege mit Kommentare doppelt ausgewaehlt, was ein Problem mit LIMIT gibt, z.b.:
(SELECT title, count(*) as ZahlderKommentare from news JOIN kommentare on kommentare.kid = news.newsid GROUP BY newsid)
UNION
(SELECT title, 0 as ZahlderKommentare from news LEFT JOIN kommentare on kommentare.kid = news.newsid GROUP BY newsid) LIMIT ?, ?
Die Eintraege mit Kommentaren kann man mit einem JOIN seperat selektieren, aber wie kann ich die ohne Kommentare seperat selektieren?
Ich suche auf jeden Falle einen Weg dieses Problem mit den Kommentaren mit sowenig seperaten Queries zu loesen wie moeglich.
Viele Gruesse,
Bastian
Hallo Bastian,
Das Problem ergibt sich beim Feststellen der Kommentarzahlen zur jeweiligen News, ich moechte dies Moeglichst in einer Abfrage behandeln.
Benutze ich z.B.
SELECT title, count(*) as ZahlderKommentare from news LEFT JOIN kommentare on kommentare.kid = news.newsid GROUP BY newsid LIMIT 1, 6
so erzeuge ich in anständigen Datenbankmanagementsystemen einen Syntaxfehler. Dieses dokumentierte Feature von MySQL führt zu Anfängerfehlern wie Deinem.
Joine stattdessen mit einem temporären View, der Dir die gewünschten Daten liefert, siehe z.B. </archiv/2008/8/t175461/#m1153411>.
Freundliche Grüße
Vinzenz
Danke, jetzt erinnere ich mich wieder!
Aber irgendwie kommt mir das ganze jetzt langsamer als vorher vor.
Hallo,
Aber irgendwie kommt mir das ganze jetzt langsamer als vorher vor.
wie wäre es, wenn Du EXPLAIN befragst?
Freundliche Grüße
Vinzenz