folgendes db konstrukt:
tabelle categorien: id,name,benutzerlevel
tabelle forum: id,cat_id,name
tabelle topics: id,forum_id,name,user_id,erstellzeit
tabelle posts: id,topic_id,user_id,erstellzeit
die eben über die jeweiligen ids miteinander verknüpft werden sollen.
wenn ich jetzt die forenübersicht erstellen möchte soll das in etwa so aussehen:
---------------------------------------------------------
| categoriename |
---------------------------------------------------------
| | name des forums | beitragszähler | letzter post|
---------------------------------------------------------
| | name des forums | beitragszähler | letzter post|
---------------------------------------------------------
bis dahin kein problem
mittlerweile habe ich zwei themen erstellen zum besseren erklären:
mysql> SELECT t.name,p.time FROM board_posts AS p INNER JOIN board_topics AS t ON p.topic_id = t.id ORDER BY time DESC;
+-----------+------------+
| name | time |
+-----------+------------+
| test2 | 1240328328 |
| testthema | 1240323773 |
+-----------+------------+
2 rows in set (0.00 sec)
ich möchte auf meiner übersichtssseite ja in dem großen query immer nur das letzte thema haben, daher musst ich da ja noch ein group by anhängen!
SELECT
categorie.name as cat,forum.name,forum.id,topics.name,posts.user_id,posts.time
FROM
board_cat as categorie
INNER JOIN
board_forum as forum
ON
categorie.id = forum.cat_id
LEFT OUTER JOIN
board_topics as topics
ON
topics.forum_id = forum.id
LEFT OUTER JOIN
board_posts as posts
ON
topics.id = posts.topic_id
GROUP BY
forum.id;
Alles anzeigen
das problem jetzt, wenn ich das so ausführe bekomme ich nicht das test2 als letzten beitrag zurück, sondern testthema, was ja aber so nicht stimmt.
mysql> SELECT
-> categorie.name as cat,forum.name,forum.id,topics.name,posts.user_id,posts.time
-> FROM
-> board_cat as categorie
-> INNER JOIN
-> board_forum as forum
-> ON
-> categorie.id = forum.cat_id
-> LEFT OUTER JOIN
-> board_topics as topics
-> ON
-> topics.forum_id = forum.id
-> LEFT OUTER JOIN
-> board_posts as posts
-> ON
-> topics.id = posts.topic_id
-> GROUP BY
-> forum.id;
+---------+------+----+-----------+---------+------------+
| cat | name | id | name | user_id | time |
+---------+------+----+-----------+---------+------------+
| testcat | News | 1 | testthema | 3 | 1240323773 |
| testcat | test | 2 | NULL | NULL | NULL |
+---------+------+----+-----------+---------+------------+
2 rows in set (0.00 sec)
Alles anzeigen
sprich ich müsste jetzt ja irgendwie vor dem group by forum.id noch irgendwie sortieren, dass ich den jünsten beitrag bekomme?
mit nem order by oder nem where lässt sich das ja aber nicht bewerkstelligen.
die einzige idee die ich hätte wäre einen subquery einzubauen, aber das ist ja nicht sonderlich performant und irgendwie auch nicht sonderlich elegant.
SELECT
categorie.name as cat,forum.name,forum.id,topics.name,posts.
(select time FROM board_posts WHERE board_posts.topic_id = topics.id ORDER BY `time` DESC)
FROM
board_cat as categorie
INNER JOIN
board_forum as forum
ON
categorie.id = forum.cat_id
LEFT OUTER JOIN
board_topics as topics
ON
topics.forum_id = forum.id
GROUP BY
forum.id
Alles anzeigen