Abfrage für Nachrichtensystem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Abfrage für Nachrichtensystem

    Ich bin im Moment dabei, ein Nachrichtensystem zu erstellen, sodass bis zu fünf User gleichzeitig sich in einem Gespräch unterhalten können.

    [Blockierte Grafik: http://i42.tinypic.com/rmjuxc.gif]

    Oben seht ihr die Datenbankspalten. Die `talker_X` beinhalten eine User-ID, die später verarbeitet wird. `last_read_date_X` beinhaltet jeweils den Timestamp zu `talker_X`, wann er das Gespräch das letzte Mal gelesen hat.

    Nun möchte ich auf der Übersichtsseite die Sektion "Gespräche mit ungelesenen Nachrichten" machen. Hierfür erfolt folgende Query (Im Beispiel hat der User die ID 123):

    Quellcode

    1. SELECT `id`,`title`,`talker_1`,`talker_2`,`talker_3`,`talker_4`,`talker_5`,`last_read_date_1`,`last_read_date_2`,`last_read_date_3`,`last_read_date_4`,`last_read_date_5`,`date`,`last_message`,`last_message_user_id` FROM `talks` WHERE (`last_read_date_1` < `last_message` OR `last_read_date_2` < `last_message` OR `last_read_date_3` < `last_message` OR `last_read_date_4` < `last_message` OR `last_read_date_5` < `last_message`) AND (`talker_1` = '123' OR `talker_2` = '123' OR `talker_3` = '123' OR `talker_4` = '123' OR `talker_5` = '123') ORDER BY `date` DESC

    Ziel ist es, alle Einträge zu finden, in denen der User 123 aktiv (`talker_X` = '123') ist und deren Gespräche nicht von allen gelesen wurden (`last_read_date_X` < `last_message`). `last_message` beinhaltet den Timestamp, wann die letzte Nachricht in diesem Gespräch geschrieben wurde.

    Hat auch alles bisher gut geklappt (Übrigens werden die Einträge später per PHP weiterverarbeitet, also wenn `last_read_date_X` von User 123 größer/gleich `last_message` ist, wird die Zeile übersprungen und nicht ausgegeben). Aber, wenn jetzt alle User in diesem Gespräch das Gespräch nach der letzten Nachricht gelesen haben (sprich `last_read_date_X` ist überall größer als `last_message`) wird der Eintrag trotzdem angezeigt.

    Kann mir vllt. wer helfen, was ich falsch mache? Danke! :)
  • Erstmal habe ich deinen Einzeiler ordentlicher gemacht:

    Quellcode

    1. SELECT
    2. `id`,`title`,
    3. `talker_1`,`talker_2`,`talker_3`,`talker_4`,`talker_5`,
    4. `last_read_date_1`,`last_read_date_2`,`last_read_date_3`,`last_read_date_4`,`last_read_date_5`,
    5. `DATE`,`last_message`,`last_message_user_id`
    6. FROM
    7. `talks`
    8. WHERE
    9. ( `last_read_date_1` < `last_message`
    10. OR `last_read_date_2` < `last_message`
    11. OR `last_read_date_3` < `last_message`
    12. OR `last_read_date_4` < `last_message`
    13. OR `last_read_date_5` < `last_message`
    14. ) AND
    15. ( `talker_1` = '123'
    16. OR `talker_2` = '123'
    17. OR `talker_3` = '123'
    18. OR `talker_4` = '123'
    19. OR `talker_5` = '123'
    20. ) ORDER BY `DATE` DESC
    Alles anzeigen


    Aber Ich muss leider sagen, du hast falsch begonnen.
    Mit einer einfachen m-n Beziehung kannst dem Chat beliebige viele User hinzufügen. Und auch das Query wird wesentlich einfacher.

    Beispiel:

    chat
    chatid last_message

    user2chat
    chatid userid last_read


    Quellcode

    1. SELECT chat.* FROM user2chat INNER JOIN chat USING(chatid) WHERE userid = 123 AND last_read < last_message