Holgi: User nach Einträgen in anderer Tabelle sortieren

Hallo,

also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).

Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?

Also im Prinzip so etwas:
SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]

Danke,
Holger

  1. Welches Datenbanksystem? Bei MSSQL könnte das so klappen (ungetestet)

    [code language=sql]
    SELECT u.ID, x.counted
    FROM Usertabelle u
    LEFT OUTER JOIN
      (SELECT COUNT(*) AS counted
       FROM Anderetabelle a
       GROUP BY ID) x
    ON u.ID = x.ID
    ORDER BY x.counted ASC
    [/code]

    Gruss Sepp

    Hallo,

    also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).

    Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?

    Also im Prinzip so etwas:
    SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]

    Danke,
    Holger

    1. Welches Datenbanksystem? Bei MSSQL könnte das so klappen

      MySQL. Aber ich werde mir das Prinzip mal genauer anschauen!

      Danke,
      Holger

  2. Moin!

    Ein "natural join' kann das ganz einfach.

      
    SELECT  
    users.username AS username,  
    COUNT(id.beitraege) as beitraege  
    FROM datenbank.users, datenbank.beitraege  
    WHILE 1  
    AND datenbank.users.id=datenbank.beitraege.user_id  
    ORDER BY beitraege;  
    
    

    (Das mit WHILE 1 AND ... ist eine Macke von mir, weil ich meine Abfragebedingungen immer öfter in einer anderen Programmiersprache zusammen baue.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. yo,

      SELECT
      users.username AS username,
      COUNT(id.beitraege) as beitraege
      FROM datenbank.users, datenbank.beitraege
      c 1
      AND datenbank.users.id=datenbank.beitraege.user_id
      ORDER BY beitraege;

      es ist noch früh am morgen, da bin ich noch nicht ganz wach. aber zählt dein COUNT nicht alle datensätze, ohne rücksicht auf den benutzer oder habe ich noch nebel auf den augen ? fehlt da nicht noch eine gruppierung, bzw. eine unterabfrage ?

      Ilja

  3. Hallo,

    also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).

    Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?

    Also im Prinzip so etwas:
    SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]

    Danke,
    Holger

    Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.

    Also: Was du brauchst ist ganz einfach diese Abfrage:

    Select   Usertabelle.username
    From     Usertabelle, Eintragstabelle
    Where    Usertabelle.userid = Eintragstabelle.userid
    Group By Usertabelle.username
    Order By Count(Eintragstabelle.Eintragsid) desc;

    Damit sortierst du den User nach oben, der die meisten Einträge hat. Wenn du den User mit den wenigsten Einträgen an erster Stelle haben willst, lass das desc weg. Der Trick ist einfach das Count als OrderBy-Kriterium zu verwenden. Damit musst du es nicht anzeigen lassen.

    MfG Mero

    1. yo,

      Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.

      wie kommst du auf diese these ? ich bin mir sicher, sehr viele kennen das kreuzprodukt sehr gut. und das was du da machst, ist keine kreuzabfrage (auch bekannt als karthesisches produkt), sondern ein ganz normaler INNER JOIN.

      des weiteren ist der GROUP BY nur über den usernamen kritisch. sicherlich könnte es sich um ein UNIQUE attribut handeln, muss aber nicht. und da du schon über die id's "joinst", bietet es sich auch an, die id in die gruppierung mit reinzunéhmen, um die abfragre wasserdicht zu machen.

      auch den COUNT würde ich nicht über eine spalte bilden, obwohl es in deinem falle keine probleme geben sollte, sondern mit COUNT(*) bilden. dann ist auf einem blick sofort klar, dass alle datens#tze gezählt werden sollen.

      Ilja

      1. yo,

        Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.

        wie kommst du auf diese these ? ich bin mir sicher, sehr viele kennen das kreuzprodukt sehr gut. und das was du da machst, ist keine kreuzabfrage (auch bekannt als karthesisches produkt), sondern ein ganz normaler INNER JOIN.

        des weiteren ist der GROUP BY nur über den usernamen kritisch. sicherlich könnte es sich um ein UNIQUE attribut handeln, muss aber nicht. und da du schon über die id's "joinst", bietet es sich auch an, die id in die gruppierung mit reinzunéhmen, um die abfragre wasserdicht zu machen.

        auch den COUNT würde ich nicht über eine spalte bilden, obwohl es in deinem falle keine probleme geben sollte, sondern mit COUNT(*) bilden. dann ist auf einem blick sofort klar, dass alle datens#tze gezählt werden sollen.

        Ilja

        Ja, ich weiss, dass das keine Kreuzabfrage ist. Deshalb hab ich ja auch den Teil mit dem Where hinzugeschrieben. Unglücklich formuliert. Sorry. Bezog mich also auf das Where, anstelle des Joins und nicht auf die Kreuzabfrage an sich.
        Mir ist nur aufgefallen, dass ich fast überall nur Joins sehe, die ich persönlich schwer zu lesen finde, anstatt ein einfaches Where.

        Das Count mach ich nur deshalb über lediglich eine Spalte, weil ich der Meinung bin, dass das schneller geht, als ein Count über alle Spalten.

        Mit dem Group By hast du natürlich Recht. Da hab ich diese Schwachstelle übersehen. So funktioniert es jetzt aber richtig... Danke für den Hinweis.

        select username
        from usertabelle,eintragstabelle
        where eintrageintragstabelle.userid=userusertabelle.userid
        group by usertabelle.username,usertabelle.userid
        order by count(Eintrag.id);

        MfG Mero

        1. select username
          from usertabelle,eintragstabelle
          where eintrageintragstabelle.userid=userusertabelle.userid
          group by usertabelle.username,usertabelle.userid
          order by count(Eintrag.id);

          Hmpf... Schon blöd, wenn man nicht ordentlich nachsieht, bevor man das wegschickt.

          Select    username
          From      Usertabelle,Eintragstabelle
          Where     Eintragstabelle.userid=Usertabelle.userid
          Group By  Usertabelle.username,Usertabelle.userid
          Order By  Count(Eintragstabelle.id);

          MfG Mero

        2. yo,

          Das Count mach ich nur deshalb über lediglich eine Spalte, weil ich der Meinung bin, dass das schneller geht, als ein Count über alle Spalten.

          wenn du COUNT() über eine spalte benutzt, dann wird das dbms überprüfen, ob der inhalt der jeweiligen felder nicht NULL ist. diese werte werden nämlich nicht mitgezählt. ob er das auch für spalten macht, welche die eigenschaft NOT NULL haben, kann ich nicht zu 100% sagen, würde aber auf ja tippen. was aber wichtiger ist, dass bei der benutztung von COUNT(*) das dbms auf keinen fall inhalte prüfen wird und somit am schnellsten arbeitet. damit ist man also auf der sicheren seite.

          Ilja