Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[SQL] group by + joins -> sortierungsproblem
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #1
[SQL] group by + joins -> sortierungsproblem
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:

Code:
---------------------------------------------------------
| 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:

Code:
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!

Code:
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;

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.

Code:
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)

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.

Code:
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

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
21.04.2009 17:37
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Benedikt Offline
this is serious!

Beiträge: 1.674
Registriert seit: Jul 2008
Beitrag #2
[SQL] group by + joins -&gt; sortierungsproblem
Hmm probier mal

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 LIMIT 1)

b1
21.04.2009 19:58
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #3
[SQL] group by + joins -&gt; sortierungsproblem
das ist quasi das selbe wie mein letzter query und immernoch mit langsammen subquery, das bringt mir recht wenig. vorallem da die einfach nur langsam werden, um so länger der datenbestand wird!

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
21.04.2009 22:36
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #4
[SQL] group by + joins -&gt; sortierungsproblem
so problem gelöst, aufgrund von performancesachen und der komplexität mit subquerys die arsch langsam werden....
ich hab ne dopplung in kauf genommen und damit den allgemein dbload noch verringern können ;)

und es arbeitet auch.
bewundert werden kanns hier:

Siginfo » SIB

allerdings kann man bis dato nur in ein thread reinposten, da ich möglichkeiten zur threaderöffnung noch nicht implementiert hab :D
aber das grundding steht ;)

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
22.04.2009 23:29
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste