Forum: Beitragsübersicht mit "Letzter Besuch"
nilsfad
- datenbank
0 Vinzenz Mai0 nilsfad
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
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
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