nilsfad: Forum: Beitragsübersicht mit "Letzter Besuch"

Hallo Forum-Gemeinde,

Momentan habe ich die Arbeit an einem alten Projekt von mir - ein Internetforum - wieder aufgenommen und brauche wieder einmal Hilfe.
Und zwar soll in die Beitragsübersicht des Forums jetzt auch eine Spalte eingebaut werden, die Datum und Uhrzeit des letzten Besuches des Benutzers zeigt.
Es existiert folgende Beispieltabelle:

prb_message
+------------+--------------------+---------+--------+----------+---------------------+
| message_id | hierarchy_location | request | status | author   | date_posted         |
+------------+--------------------+---------+--------+----------+---------------------+
|          2 | 1                  | hallo   | active | tario    | 2008-01-08 20:22:20 |
|          3 | 2                  | Karma   | active | tario    | 2008-01-08 20:35:28 |
|          4 | 3                  | About   | active | tario    | 2008-01-08 20:40:01 |
|          5 | 4                  | pleas   | active | tario    | 2008-01-08 21:19:30 |
|          6 | 1.1                | Hey y   | active | Hiobhan  | 2008-01-08 22:08:29 |
|          7 | 5                  | Dear    | active | Hiobhan  | 2008-01-08 22:11:38 |
|          8 | 2.1                | Yes,    | active | miro     | 2008-01-08 23:27:56 |
|          9 | 4.1                | well,   | active | miro     | 2008-01-08 23:32:47 |
+------------+--------------------+---------+--------+----------+---------------------+

Mit folgendem ausführlichem SQL-Statement lasse ich momentan die Beitragsübersicht generieren:

SELECT  
  pr1.message_id,  
  pr1.hierarchy_location,  
  pr1.request AS RequestText,  
  pr1.author,  
  prc.category,  
  CONCAT(pu.first_name, ' ', pu.last_name) AS FullName,  
  COUNT(pr1.message_id) - 1 AS CommentCount,  
  date_format(MAX(pr2.date_posted), '%d.%m.%y %H:%i') AS LastActivity  
  
FROM prb_message pr1  
  
INNER JOIN prb_message_category prc  
ON pr1.message_id = prc.message_id  
  
LEFT JOIN prb_user pu  
ON pr1.author = pu.login_name  
  
INNER JOIN prb_message pr2  
ON pr1.hierarchy_location =  
  (IF (LOCATE('.', pr2.hierarchy_location),  
    LEFT(pr2.hierarchy_location, LOCATE('.', pr2.hierarchy_location) - 1),  
    pr2.hierarchy_location))  
  
GROUP BY  
  pr1.message_id,  
  pr1.hierarchy_location,  
  RequestText,  
  pr1.author,  
  prc.category,  
  pu.last_name,  
  pu.first_name  

Um zu dokumentieren, welcher Benutzer wann welchen Beitrag gesichtet hat, habe ich diese Tabelle erstellt:

prb_message_viewed_last
+------------+------------+---------------------+
| login_name | message_id | viewed_last         |
+------------+------------+---------------------+
| nils       |          4 | 2008-01-10 21:47:35 |
| nils       |          5 | 2008-01-09 22:33:30 |
| nils       |          3 | 2008-01-09 22:36:30 |
| Emma       |          3 | 2008-01-10 02:51:00 |
| miro       |          3 | 2008-01-10 13:05:33 |
| miro       |          4 | 2008-01-10 13:05:59 |
+------------+------------+---------------------+

Leider gelingt es mir nicht, das oben aufgeführte SQL-Statement so zu verändern, dass in der Ergebnistabelle eine weitere Spalte für das Datum des letzten Besuches des aktuellen Benutzers aufgelistet wird. Es ist inzwischen leider sehr Komplex geworden und aus Performancegründen möchte ich daraus nicht zwei Statements machen.

Vor einiger Zeit existierte schonmal ein Thread von mir ebenfalls zu dem Forum, wo noch einige Informationen enthalten sind:
http://forum.de.selfhtml.org/archiv/2006/8/t134684

Wär' schön wenn sich hier nochmal so ein richtiger Profi auftun würde, der sowas vielleicht schon x-mal gemacht hat und mir helfen kann.

Gruß
nilsfad

  1. Hallo,

    Vor einiger Zeit existierte schonmal ein Thread von mir ebenfalls zu dem Forum, wo noch einige Informationen enthalten sind:
    http://forum.de.selfhtml.org/archiv/2006/8/t134684

    hat sich seit damals was an der Dir zur Verfügung stehenden MySQL-Version geändert? Mit der 3.23.58 wirst Du wenig Freude an Deinem Vorhaben haben.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz :-)

      hat sich seit damals was an der Dir zur Verfügung stehenden MySQL-Version geändert? Mit der 3.23.58 wirst Du wenig Freude an Deinem Vorhaben haben.

      Auf meinem Testsystem läuft inzwischen eine 5.0.51, allerdings wäre es wünschenswert, mein Forum auch zu älteren 3er Versionen Abwärtskompatibel zu machen.

      Inzwischen habe ich es sogar geschafft, das Vorhaben mittels eines Sub-Selects zu realisieren, was ja aber leider bekanntlich bei der alten MySQL Version 3 noch nicht möglich ist.

      SELECT  
        pr1.message_id,  
        pr1.hierarchy_location,  
        pr1.request AS RequestText,  
        pr1.author,  
        prc.category,  
        CONCAT(pu.first_name, ' ', pu.last_name) AS FullName,  
        COUNT(pr1.message_id) - 1 AS CommentCount,  
        date_format(MAX(pr2.date_posted), '%d.%m.%y %H:%i') AS LastActivity,  
        date_format(mvl.viewed_last, '%d.%m.%y %H:%i') AS ViewedLast  
      FROM prb_message pr1  
      INNER JOIN prb_message_category prc ON pr1.message_id = prc.message_id  
      LEFT JOIN prb_user pu ON pr1.author = pu.login_name  
      LEFT JOIN (SELECT * FROM prb_message_viewed_last WHERE login_name LIKE 'nils') mvl  
        ON pr1.message_id LIKE mvl.message_id  
      INNER JOIN prb_message pr2  
        ON pr1.hierarchy_location =  
          (IF (LOCATE('.', pr2.hierarchy_location),  
          LEFT(pr2.hierarchy_location, LOCATE('.', pr2.hierarchy_location) - 1),  
          pr2.hierarchy_location))  
      GROUP BY  
        pr1.message_id,  
        pr1.hierarchy_location,  
        RequestText,  
        pr1.author,  
        prc.category,  
        pu.last_name,  
        pu.first_name  
      
      

      Wäre das gleiche auch über einen geschickten Self-Join realisierbar? Natürlich nur wenn sich der Aufwand dafür in Maßen hält.

      Gruß
      Nils