# SQL-Abfrage [ANFÄNGER]



## R00Ki3 (16. Mai 2006)

ich hab 3 tabellen!

Tabelle 1 (FORUM) besteht aus den feldern:
ID, User_id(=Wert aus USER.id), Titel, Datum

Tabelle 2 (FORUM_BEITRAG) besteht aus den feldern:
ID, Thema_id(=Wert aus FORUM.id), User_id(=Wert aus USER.id), Beitrag, Datum

Tabelle 3 (USER) besteht aus den feldern:
id, name
Ausgabewert sollen Sein:
Titel, User_id, name, Count(ID) für jede Thema_id, Max(Datum) für jede Thema_id, User_id von Max(Datum) für jede Thema_id.


Momentan bekomme ich ausgegeben:
Thema_id, Anzahl an Beiträge für diese Thema_id, Lastpost Datum.
select thema_id, count(user_id) anzahl, max(datum) lastpost from forum_beitrag group by thema_id;

Ich hoffe mal das ich es halbwegs verständlich gestalltet habe, wo ich aber jetzt schon dran zweifel...


----------



## progger12 (18. Mai 2006)

Hi R00ki3, 

ich denke dein Problem ist es Daten aus mehreren Tabellen in einem einzigen select statement abzurufen. Das geht nicht so ohne weiteres, weil du ihm genauer sagen musst, wo er die Elemente findet.
das kannst du machen, in dem du die Tabelle, aus der die Daten kommen, vor den Spaltennamen schreibst.

beispiel: select FORUM_BEITRAG.Beitrag, USER.name from FORUM_BEITRAG, USER;

damit man sich dabei nicht dämlitsch schreibt gibt es die Aliase. Dazu schreibt man den Alias, den man für eine Tabelle nutzen will, einfach hinter die Tabellenauflistung nach dem FROM. Das sähe folgendermassen aus:
select a.Beitrag,b.name from FORUM_BEITRAG a, USER b;

damit solltest du weiterkommen.
Wenn du noch andere Fragen hast, zB. die Tabellen sind in unterschiedlichen Schemata, weiterfragen.. ;-)

grüße
Hendrik


----------



## R00Ki3 (18. Mai 2006)

OK, danke für den Tip.
Ich bin auch schon mal etwas weiter gekommen.
Für den momentan bin ich aber mal wieder an einer wissensgrenze angelangt.

Meine Abfrage sieht momentan so aus:

SELECT 
   forum.id, 
   forum.titel, 
   forum.user_id AS author, 
   forum.datum AS erstellt,
forum_beitrag.user_id AS lastposter, 
   max( forum_beitrag.datum ) lastpost, 
   count( forum_beitrag.thema_id ) anzahl
        FROM 
            forum, 
            forum_beitrag
                  WHERE forum.id = forum_beitrag.thema_id
                  GROUP  BY forum_beitrag.thema_id
                  ORDER  BY lastpost DESC 

Fehlerhaft ist noch, das der ausgabewert lastposter nicht der realität entspricht. (Rot gegenzeichnet)
Es wird immer die id des ersten posts innerhalb der tabelle zurückgegeben.


----------



## Nico Graichen (18. Mai 2006)

Du musst in der WHERE-Clause zusätzlich auf das maximale Datum einschränken.
Das kannst du MAX(datum) im SELECT-Teil weg lassen und nur das Datum abfragen.


----------



## R00Ki3 (20. Mai 2006)

SELECT
 forum.id,
 forum.titel,
 forum.user_id AS author,
 user.user AS authorname,
 min( forum_beitrag.datum ) AS firstpost,
 forum_beitrag.user_id AS lastposter,
 user.user AS lastpostname,
 max( forum_beitrag.datum ) AS lastpost,
 count( forum_beitrag.thema_id ) anzahl
FROM forum, forum_beitrag, user
WHERE forum.id = forum_beitrag.thema_id
AND user.id = forum.user_id
AND user.id = forum_beitrag.user_id
GROUP BY forum_beitrag.thema_id
ORDER BY lastpost DESC;

niggo erstmal danke...

Hab das mal geändert...
Hab nur noch ein kleines Problem, der Wert user_id & user für lastpost beinhaltet nicht das was es soll, es sieht so aus als ob es der Wert von Min(...) sei.


----------

