Moin zusammen.
Heute mal ein SQL-Problem...
Ich versuche in einem "Probier-Projekt" ein kleines Chat System zu basteln und bin mir nicht sicher, ob ich zu umständlich bin oder ich mit SQL nicht ganz klar komme.
Versuch Nr.1:
den ganzen Chat in einer Tabelle:
Tabellenname: messages:
messageID | senderID | recieverID | status | timestamp | content
meine Abfrage dazu sah so aus:
funktioniert wie erwartet, zeigt aber aber natürlich alle Nachrichten an und nicht nur die letze pro Gespräch.
Ein hinzufügen von:
scheitert schon mal daran, das ich ja einmal nach recieverID und einmal nach senderID gruppieren müsste...
meine nächste Idee sah dann so aus, das ich die Abfragen für gesendete und empfangene Nachrichten separat mache... was klappt, aber die Übersichtlichkeit nicht unbedingt verbessert.
Es sollen prinzipiell die Nachrichten nach Zeit sortiert sein und nicht nach empfangen/gesendet...
Da ich das Problem auch durch googlen nicht lösen konnte, hab ich einen neuen Versuch mit 2 Tabellen gestartet:
Versuch Nr.2:
Zwei Tabellen für den Chat:
Tabellenname: conversations:
conversationID | starterID | partnerID
Tabellenname: messages:
messageID | conversationID | senderID | status | timestamp | content
ich benutze jetzt 2 Abfragen:
mit der ersten hole ich die Konversationen an denen der User beteiligt ist:
mit der zweiten hole ich dann aus der anderen Tabelle die jeweils letzte Nachricht:
das funktioniert, da die erste Abfrage aber nach der ID sortiert ist, sind die anschließende Gespräche auch entsprechend sortiert und nicht nach der Zeit.
Meine Lösung:
quasi Variante 2b:
die Tabelle conversations um die Spalte timestamp zu erweitern und bei jeder Nachricht die in die messages-Tabelle eingetragen wird zusätzlich in der conversations-Tabelle den timestamp zu erneuern
und entsprechend sieht die erste Abfrage dann so aus:
damit klappt mein Chat genauso wie ich es will...
Aber es erscheint mir recht umständlich.
Ich bin immernoch davon überzeugt, das es eine Möglichkeit mit nur einer Tabelle gibt, wahrscheinlich fehlen mir da noch tiefere SQL-Kenntnisse...
Ich hätte gern mal eure Meinung dazu:
Wie würdet ihr das anstellen, was haltet ihr von meinen Versuchen?
Heute mal ein SQL-Problem...
Ich versuche in einem "Probier-Projekt" ein kleines Chat System zu basteln und bin mir nicht sicher, ob ich zu umständlich bin oder ich mit SQL nicht ganz klar komme.
Versuch Nr.1:
den ganzen Chat in einer Tabelle:
Tabellenname: messages:
messageID | senderID | recieverID | status | timestamp | content
meine Abfrage dazu sah so aus:
Code:
SELECT * FROM messages WHERE senderID = '$userID' OR recieverID = '$userID' ORDER BY timestamp DESC
Ein hinzufügen von:
Code:
GROUP BY ...
meine nächste Idee sah dann so aus, das ich die Abfragen für gesendete und empfangene Nachrichten separat mache... was klappt, aber die Übersichtlichkeit nicht unbedingt verbessert.
Es sollen prinzipiell die Nachrichten nach Zeit sortiert sein und nicht nach empfangen/gesendet...
Da ich das Problem auch durch googlen nicht lösen konnte, hab ich einen neuen Versuch mit 2 Tabellen gestartet:
Versuch Nr.2:
Zwei Tabellen für den Chat:
Tabellenname: conversations:
conversationID | starterID | partnerID
Tabellenname: messages:
messageID | conversationID | senderID | status | timestamp | content
ich benutze jetzt 2 Abfragen:
mit der ersten hole ich die Konversationen an denen der User beteiligt ist:
Code:
SELECT conversationID FROM conversations WHERE starterID = '$userID' OR partnerID = '$userID'
Code:
SELECT * FROM messages WHERE conversationID = '$convID ORDER BY timestamp DESC LIMIT 1
Meine Lösung:
quasi Variante 2b:
die Tabelle conversations um die Spalte timestamp zu erweitern und bei jeder Nachricht die in die messages-Tabelle eingetragen wird zusätzlich in der conversations-Tabelle den timestamp zu erneuern
Code:
UPDATE conversation SET timestamp = CURRENT_TIMESTAMP WHERE conversationID = '$convID'
Code:
SELECT conversationID FROM conversations WHERE starterID = '$userID' OR partnerID = '$userID' ORDER BY timestamp DESC
Aber es erscheint mir recht umständlich.
Ich bin immernoch davon überzeugt, das es eine Möglichkeit mit nur einer Tabelle gibt, wahrscheinlich fehlen mir da noch tiefere SQL-Kenntnisse...
Ich hätte gern mal eure Meinung dazu:
Wie würdet ihr das anstellen, was haltet ihr von meinen Versuchen?
Kommentar