SQL MySQL Befehl mit GROUP BY und Einzelwert

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.503
Hi,

Ich habe eine Tabelle mit Kommentaren und eine zweite Tabellen mit likes.
Die like-Tabelle enthält jeweils die KommentarID, die userID desjenigen, der geliked hat einen bool-Wert, der angibt, ob es gelikt ist, oder nicht.

Mein SQL-Befehl sucht mir nun alle Kommentare mit bestimmten Kriterien heraus und zeigt mir über einen SUM Befehl die Anzahl der likes auf diesen Kommentar an.

Um entscheiden zu können, ob ich dem Benutzer ein 'Gefällt mir' oder 'Gefällt mir nicht mehr' anbiete, brauche ich noch die Information, ob unter einem dieser 'likes' der mit der aktuellen userID dabei ist, oder nicht. Nach viel rumprobieren habe ich es geschafft. Ich frage mich allerdings, ob das so kopmliziert sein muss, oder ob ich die einfache Lösung übersehe. Es geht hier vor allem um die 2. Zeile:

Code:
SELECT comments.commentID, comments.date_create, comments.username, comments.content, 
SUM(IF(likes.like_bool=1,1,0)), SUM(IF(likes.userID=? AND likes.like_bool=1,1,0))
FROM comments 
LEFT JOIN likes ON comments.commentID=likes.commentID 
WHERE comment.topic=? 
GROUP BY comments.commentID 
ORDER BY comments.date_create DESC LIMIT ?, ?
 
Mal ne blöde Frage wozu ist der bool Wert da?
Eintrag in der like Tabelle -> like
kein Eintrag -> kein like

Also wen es wirklich nur darum das der User der gerade die Seite aufruft jetzt einen like button oder keinen erhält hast du dir es wirklich viel zu komplex gemacht.

Code:
select * from like where userid=User and commentid=Comment
Wenn jetzt eine Zeile zurück kommt, dann hat er halt schon geliked.
Falls keine zurück kommt, dann halt noch nicht.
 
Stimme dude90 zu, den bool brauchst du nicht, da ein Eintrag in der Like-Tabelle selbsterklärend ist.
Somit reicht einfach ein LEFT OUTER JOIN auf deine LIKE Tabelle: Eintrag -> Like, NULL -> Kein Like.
Damit kannst du auch ganz easy deine Summe realisieren.
 
Es werden ne ganze Reihe Kommentare abgerufen und in einem while($stmt->fetch()) Block verarbeitet. Eure Lösung ist einfacher als meine, aber da hätte ich eine SQL Abfrage in der SQL Abfrage starten müssen. Abgesehen davon, dass ich dann 2 MySQL Verbindungen gleichzeitig herstellen müsste, dachte ich es wäre von der Performance her besser, einmal eine größere Abfrage zu starten, die alle infos enthält, als bei jedem Schleifendurchlauf wieder eine kleine Abfrage.
 
Was genau und wie genau möchtest du denn verarbeiten?

Bei Unterabfragen muss man natürlich immer auf die Performance schauen, aber sehr oft lassen sich Unterabfragen auch durch Joins realisieren.
Das ist aber von Fall zu Fall unterschiedlich.
 
Zurück
Oben