Jirka: JOIN oder WHERE

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

  1. 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

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
    1. Und deine Frage dazu lautet wie?

      Wie kann ich das mit JOIN oder WHERE umsetzten?

      1. 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

        --
        Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
        1. 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.

          1. Hi Jirka

            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.

            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

          2. 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

            --
            Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!