Anfragen verschachteln

ossionline

Grünschnabel
Hi,

Ich habe eine Gallerie, in der angemeldete User Kommentare hinterlassen können. Die abfrage dafür habe ich immer über temporary tables gestaltet, dies ist jetzt bei meinem neuen Provider nicht mehr möglich.
Die alte anfrage sah wie folgt aus:

Code:
CREATE TEMPORARY TABLE comments_temp TYPE  =  HEAP 

SELECT MAX( comment_id ) as comment_id, image_id, COUNT( * ) AS comment_sum
FROM comments
GROUP BY image_id
ORDER BY comment_id DESC;

Code:
SELECT * 
FROM comments c, users u, comments_temp x
WHERE c.user_id = u.user_id
AND c.comment_id = x.comment_last_id
LIMIT 10

Mit der 1. Anfrage habe ich die neusten Kommentare (höhste comment_id) der verschiedenen Bilder, die Bilder-id sowie die Anzahl der Kommentare zu diesen Bild bekommen. Mit der 2. Abfrage habe ich die User-Informationen anhand der comment_id geholt.

Nun wollte ich das ganze ohne temporary tables lösen, mein erster gedanke war:

Code:
SELECT *
FROM 4images_comments c, 4images_users u
WHERE c.user_id = u.user_id
AND c.comment_id = (
SELECT MAX( comment_id ) AS comment_id, image_id, COUNT( * ) AS comment_sum
FROM 4images_comments
GROUP BY image_id
ORDER BY comment_id DESC)
LIMIT 10

Dies funktioniert jedoch leider nicht.
Wie kann ich die Anfrage gestalten, dass das erwünschte Ergebnis rauskommt?


hier nochmal der Aufbau von comment: comment_id image_id user_id user_name comment_headline comment_text
und users: user_id user_name

Hab auch schon überlegt, dass ich users gar nicht brauche, da ich von dort nur den user-namen holen will, der aber auch in comments steht

My-SQL-Version ist 4.0.24_Debian-10-log
 
Zuletzt bearbeitet:
ossionline hat gesagt.:
Hab auch schon überlegt, dass ich users gar nicht brauche, da ich von dort nur den user-namen holen will, der aber auch in comments steht

Ich denke nicht das du das mit dem usernamen machen solltest, benutze die userid, die ist (sollte) eindeutig (sein)!
 
ossionline hat gesagt.:
My-SQL-Version ist 4.0.24_Debian-10-log
MySQL unterstützt Subqueries erst ab Version 4.1.
Du könntest es mit dem Ansatz von Tom versuchen.

Gruß hpvw

PS: Fehlermeldungen helfen übrigens, die Fehlerquelle einzugrenzen, wenn man die Fehlermeldung ausgibt.
 
Zuletzt bearbeitet:
Danke, mit

Code:
select a.* 
from comments a LEFT JOIN comments b ON a.image_id = b.image_id AND a.comment_id < b.comment_id 
WHERE b.comment_id IS NULL
ORDER BY a.comment_id DESC
LIMIT 10

Klappt das ganze schon mal in der richtigen Reihenfolge. Kann ich die Anzahl der Kommentare pro Bild hier noch reinbekommen? Sonst mach ich halt ne 2. Abfrage.
 
Ich habe Toms Query mal etwas aufgebohrt:

Tabelle groupMaxCountTest
Testdaten:
Code:
id  	fid  	maxField
1  	4  	10
2 	3 	20
3 	4 	30
4 	3 	10
5 	4 	20
Query:
Code:
SELECT 
  a.id, 
  a.fid, 
  a.maxField, 
  COUNT(*) AS Anzahl
FROM `groupMaxCountTest` AS a 
LEFT JOIN `groupMaxCountTest` AS b
  ON a.maxField<b.maxField AND a.fid=b.fid
LEFT JOIN `groupMaxCountTest` AS c
  ON a.fid=c.fid
WHERE b.id IS NULL
GROUP BY a.fid
Ergebnis:
Code:
id  	fid  	maxField  	Anzahl
2	3 	20 		2
3	4 	30 		3
EDIT: was hier stand war blöd. COUNT(*) genügt.

Das Feld, welches in der WHERE-Klausel auf null geprüft wird sollte als NOT NULL definiert sein.

Gruß hpvw
 
Zuletzt bearbeitet:
Zurück