JOIN oder WHERE
Jirka
- datenbank
Hallo,
habe folgendes Problem.
Ich habe eine Datenbank mit folgenden Tabellen
USER (id, firstname, lastname)
ARTICLE (id, user_id, time, text)
Nun möchte ich durch einen SELECT alle User anzeigen anzeigen, die bereits Artikel geschrieben haben. Dabei soll die Userliste so sortiert sein, dass immer die User ganz oben stehen, die zuletzt Artikel geschrieben haben.
Gruß
Jirka
Moin!
Ich habe eine Datenbank mit folgenden Tabellen
USER (id, firstname, lastname)
ARTICLE (id, user_id, time, text)
Nun möchte ich durch einen SELECT alle User anzeigen anzeigen, die bereits Artikel geschrieben haben. Dabei soll die Userliste so sortiert sein, dass immer die User ganz oben stehen, die zuletzt Artikel geschrieben haben.
Und deine Frage dazu lautet wie?
- Sven Rautenberg
Und deine Frage dazu lautet wie?
Wie kann ich das mit JOIN oder WHERE umsetzten?
Moin!
Und deine Frage dazu lautet wie?
Wie kann ich das mit JOIN oder WHERE umsetzten?
UND! Die Antwort lautet: Mit JOIN und WHERE. Und ORDER BY zum Sortieren. Und GROUP BY zum Zusammenfassen von gleichen User-IDs innerhalb der Artikel.
Geh schrittweise vor. Und lerne dabei.
Schritt 1: Abfrage aller User-IDs, die Artikel in der DB haben. Mehrfachnennungen ausschließen.
Schritt 2: Diese Liste nach Datum sortieren, das neueste zuerst.
Schritt 3: Diese Liste jetzt mit den Benutzerdaten verknüpfen.
Was davon kannst du? Was davon hast du versucht? Mit welchem Ergebnis? Welche Probleme traten auf?
Schließlich willst du deine Probleme doch vermutlich irgendwann mal selbst lösen. Auf dem Lernweg dahin gibts hier reichlich Hilfestellung. Fertiglösungen leider nicht.
- Sven Rautenberg
Habe bisher folgenden Ansatz:
select a.firstname, a.lastname from USER as a
LEFT JOIN ARTICLE as b on a.id=b.userid
ORDER BY time DESC
Nur werden hier User die mehr als einen Artikel geschrieben haben auch mehrfach aufgelistet. Es soll aber so sein, dass ein User nur einmal in der Liste vorkommen soll. Unabhänig davon, ober ein oder mehrere Artikel geschrieben hat.
Hi Jirka
select a.firstname, a.lastname from USER as a
LEFT JOIN ARTICLE as b on a.id=b.userid
ORDER BY time DESCNur werden hier User die mehr als einen Artikel geschrieben haben auch mehrfach aufgelistet. Es soll aber so sein, dass ein User nur einmal in der Liste vorkommen soll. Unabhänig davon, ober ein oder mehrere Artikel geschrieben hat.
Ich zittiere Sven:
"Und GROUP BY zum Zusammenfassen von gleichen User-IDs innerhalb
der Artikel."
=> GROUP BY
Vorab gleich: GROUP BY kommt _vor_ die ORDER BY-Klausel.
Viele Grüsse
Philipp
Moin!
Habe bisher folgenden Ansatz:
Hervorragend. Damit kann man arbeiten.
select a.firstname, a.lastname from USER as a
LEFT JOIN ARTICLE as b on a.id=b.userid
ORDER BY time DESC
Zunächst mal: Ausgangslage ist, dass ein Artikel vorliegt. Deshalb würde ich als erstes mit der Artikel-Tabelle anfangen. Als Alias ist ein "a" ganz gut (a wie artikel). Die User-Tabelle kriegt den Alias u.
SELECT * (kommt noch) FROM article as a LEFT JOIN user as u ON a.userid = u.id
Allen geschriebenen Artikeln werden jetzt jeweils die Benutzerdaten zugeordnet.
Damit doppelte User-IDs nur einmal auftreten, muß man gruppieren. Und sich entscheiden, welcher Wert aus den vielen Zeilen, die zusammengefaßt werden, genommen werden soll.
SELECT COUNT(u.id) as artikelzahl, MAX(a.time) as lastarticle, a.userid, u.firstname, u.lastname, FROM article as a LEFT JOIN user as u ON a.userid = u.id GROUP BY a.userid ORDER BY lastarticle DESC
Es kann dir dabei aber passieren, dass deine Datenbank über die Verwendung von u.firstname und u.lastname meckert. So in der Art "keine Aggregatfunktion verwendet, obwohl GROUP BY benutzt wird".
- Sven Rautenberg