wiedereinmal stehe ich vor einem Problem. Ich bin gerade dabei ein Forum zu machen, und möchte gerne die Themen sortieren (sprich da wo der letzte Eintrag war, nach ganz oben)
Folgende Infos habe ich da für euch:
Tabelle forum_thema:
forum_thema_id
forum_id
-…usw
Tabelle forum_eintrag:
forum_thema_id
eintrag_time
thema_id
-…usw
Jeder Eintrag ist einem Thema zugewiesen, ich möchte nun die id geordnet nach den neuesten Themen selektieren. Die Forum ID wird von php eingegeben, und ist jetzt zum Beispiel 1
Meine derzeite Lösung sieht so aus:
SELECT forum_thema_id
FROM forum_thema, forum_eintrag
WHERE forum_thema.forum_id=1 AND forum_thema.forum_thema_id=forum_eintrag.thema_id
ORDER BY eintrag_time DESC
Und sobald ich ein group by dazu gebe, funktioniert es nicht mehr. (eh klar)
In welcher Reihenfolge wird das eigentlich abgearbeitet.
Ich denke mir mal wie folgt:
Es wird jede Tabelle mit jeder verknüpft (auch jede spalte wird noch behalten
Dann wird mit where einiges weg geschmissen
Dann wird das gemacht was geben als erster steht, order by oder group?
dann werden die selektiert die nach SELECT stehen.
Stimmt wahrscheinlich nicht, aber ich wollte euch einmal erklären worauf ich mit meiner Frage hinaus will.
Jeder Eintrag ist einem Thema zugewiesen, ich möchte nun die id geordnet nach den neuesten Themen selektieren. Die Forum ID wird von php eingegeben, und ist jetzt zum Beispiel 1
Ich bin mir nicht sicher, dich richtig zu parsen. Falls ja: du brauchst doch nur nach eintrag_time zu sortieren.
Meine derzeite Lösung sieht so aus:
SELECT forum_thema_id
FROM forum_thema, forum_eintrag
WHERE forum_thema.forum_id=1 AND forum_thema.forum_thema_id=forum_eintrag.thema_id
ORDER BY eintrag_time DESC
>
> Und sobald ich ein group by dazu gebe, funktioniert es nicht mehr. (eh klar)
Was genau willst Du denn gruppieren?
> In welcher Reihenfolge wird das eigentlich abgearbeitet.
>
> Ich denke mir mal wie folgt:
>
> - Es wird jede Tabelle mit jeder verknüpft (auch jede spalte wird noch behalten
> - Dann wird mit where einiges weg geschmissen
> - Dann wird das gemacht was geben als erster steht, order by oder group?
> - dann werden die selektiert die nach SELECT stehen.
Auch nach 3 mal lesen und 5 Bier hab ich Probleme, da einen Sinn zu erkennen. Vermutlich fehlt Bier.
> Stimmt wahrscheinlich nicht, aber ich wollte euch einmal erklären worauf ich mit meiner Frage hinaus will.
>
> Bitte um Infos oder Links.
>
> Danke im voraus
> Darian
Es wäre u.U. hilfreich, Du würdest mal bleistifthaft Deine Tabellen mit Content als SQL hier nennen und dann auch das, was Du Dir erhoffst. Alternativ mir einen Kasten Radeberger vors Haus stellen.
\
\
Andreas
das mit EXPLAIN ist schon eine feine Sache. Leider habe ich Probleme da genaueres heraus zu lesen (sprich ich verstehe nicht so ganz was man dann da raus sieht)
Bericht erstellen kann ich nicht (=> Berichtdatenbank nicht installiert)
Ohne das SELECT dazu ist das latürnich auch schwer zu verstehen. Was man sieht, ist, daß da auf forum_thema.forum_id offensichtlich kein Index ist. Besser wäre, man hätte das SELECT dazu und, Du hättest EXPLAIN ANALYSE gerufen. Das bringt nicht nur Schätzungen, sondern auch reale Kosten ans Tageslicht.
EXPLAIN ANALYSE SELECT forum_thema_id
FROM forum_thema, forum_eintrag
WHERE forum_thema.forum_id=1 AND forum_thema.forum_thema_id=forum_eintrag.thema_id
ORDER BY eintrag_time DESC
Tja, z.B., daß die Statistiken schlecht sind. Geschätze 940 zu realen 35 rows deuten auf jede menge dead tuples hin, Du solltest Dir mal VACUUM ANALYSE anschauen
Hättest du bitte auch Infos diesbezüglich auf deutsch…?
Hä? Möchtest Du, das ich SQL-Befehle eindeutsche?
Oder meinst Du eine Erklärung für EXPLAIN in deutsch? Falls ja, google mal nach diesen Begriffen:
Susanne Ebrecht EXPLAIN freex
Ich bin grad zu faul und finde auch den Link nicht gleich, aber Miracee^WSusanne hat in der FreeX vor einigen Wochen einen Grundlagenartikel dazu geschrieben. In deutsch.
Bezieht sich diese Bemerkung auf Deinen ersten Beitrag hier im Thread und der dort geschilderten Tabellenstruktur?
Falls ja:
test=*# select * from forum_eintrag;
forum_thema_id | eintrag_time | thema_id | inhalt
----------------+----------------------------+----------+-------------
1 | 2007-04-21 12:24:11.027365 | 1 | bla fasel
1 | 2007-04-21 12:24:29.975524 | 1 | bla fasel 2
1 | 2007-04-21 12:24:36.580611 | 1 | bla fasel 3
2 | 2007-04-21 12:24:57.668316 | 1 | foo bar
1 | 2007-04-21 12:25:03.487877 | 1 | bla fasel 4
2 | 2007-04-21 12:25:10.805913 | 1 | foo bar 2
(6 rows)
test=*# select * from forum_eintrag
where (forum_thema_id, eintrag_time) in (
select forum_thema_id, max(eintrag_time) from forum_eintrag group by forum_thema_id);
forum_thema_id | eintrag_time | thema_id | inhalt
----------------+----------------------------+----------+-------------
1 | 2007-04-21 12:25:03.487877 | 1 | bla fasel 4
2 | 2007-04-21 12:25:10.805913 | 1 | foo bar 2
(2 rows)
Hab jetzt mal was pöses gemacht: select *. Es wäre vielleicht sinnvoll, jedem Eintrag eine eindeutige ID (via SERIAL) zu verpassen, dann wäre der JOIN wohl einfacher. Die passenden Indexe zu finden überlasse ich Dir zur Übung…
Hallo, dabei habe ich natürlich wieder ein paar Fragen wie soll es anders sein)
Die Spalte forum_thema_id gibt es nicht in dieser Tabelle, da heißt sie komischerweise nur forum_id (ich weiß ich weiß, und wenn ich das ändere, bekomme ich sogar ein Ergebnis) Hast du das so gemeint?
Das ist ja ein Intersection? Du arbeitest aber immer nur mit einer Tabelle, braucht man dazu nicht zwei? (immer nur die forum_eintrag)
irgendwo muß ja reingeschreiben die forum_id eingegbeen sein. Sprich die Themen in diesem Forum sollen nur selektiert werden…?
Ach ja, noch was, habe nicht so wirklich gefunden was das max macht. Was tut es den? (nehme mal an er selektiert den höchsten Wert, oder?)
Die Spalte forum_thema_id gibt es nicht in dieser Tabelle, da heißt sie komischerweise nur forum_id (ich weiß ich weiß, und wenn ich das ändere, bekomme ich sogar ein Ergebnis) Hast du das so gemeint?
Ähm, vermutlich.
Das ist ja ein Intersection? Du arbeitest aber immer nur mit einer Tabelle, braucht man dazu nicht zwei? (immer nur die forum_eintrag)
Es gibt eine Unterabfrage. Diese liefert eine Tabelle. Da waren es schon zwei.
irgendwo muß ja reingeschreiben die forum_id eingegbeen sein. Sprich die Themen in diesem Forum sollen nur selektiert werden…?
Hä?
Ach ja, noch was, habe nicht so wirklich gefunden was das max macht. Was tut es den? (nehme mal an er selektiert den höchsten Wert, oder?)