Mike: mysql ORDER BY COUNT(...)

Hallo,

ich versuche gerade aus einer Tabelle...

id gruppe

1  1
2  1
3  1
4  2
5  3
5  3
.  .
.  .

... die Datensätze nach der Anzahl ihrer "Gruppenmitglieder" geordnet auszugeben.

Es muss wahrscheinlich irgendwie so aussehen:

SELECT id, gruppe FROM table ORDER BY COUNT(gruppe)

Ich weiß nur nicht, wie ich mysql sagen soll, dass es pro gruppe zählen soll, sprich es fehlt so etwas wie GROUP BY.

Korrigiert mich bitte, wenn's so gar nicht gehen sollte (^^unwissend^^)

Danke,
Mike

  1. Hi!

    sprich es fehlt so etwas wie GROUP BY.

    Wem fehlt es, Dir?

    MySql kennt GROUP BY!

    off:PP

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
    1. Wem fehlt es, Dir?

      MySql kennt GROUP BY!

      Bloß nach welcher Spalte und wo, so dass er keinen Fehler ausgibt...
      :-=#

      1. hi,

        MySql kennt GROUP BY!
        Bloß nach welcher Spalte und wo, so dass er keinen Fehler ausgibt...

        Blind aus dem Bauch heraus, GROUP BY gruppe ORDER BY gruppe.

        mfg

        1. Blind aus dem Bauch heraus, GROUP BY gruppe ORDER BY gruppe.

          Hi,
          Dann bekomme ich für jede Gruppe aber nur ein Ergebnis,
          ich will aber alle ids einzeln haben, nur geordnet nach der Anzahl der Einträge pro Gruppe.

          Ich bräuchte das GROUP BY eben nur für die ORDER BY-Klausel, nicht für den ganzen SELECT.

          *weiter wart*

          Danke trotzdem,
           Mike

          1. hi,

            Dann bekomme ich für jede Gruppe aber nur ein Ergebnis,
            ich will aber alle ids einzeln haben, nur geordnet nach der Anzahl der Einträge pro Gruppe.

            id   gruppe
            1      3
            2      1
            3      6
            4      8
            5      3
            6      6
            7      3

            Ergebnis mit GROUP BY
            gruppe(8,6,3,1)

            ORDER BY
            gruppe(8,6,6,3,3,3,1)

            oder?

            Wie soll das Gewünschte Ergebnis aussehen?

            mfg

            1. Hi,

              Wie soll das Gewünschte Ergebnis aussehen?

              im Beispiel soll es so rauskommen:

              id   gruppe
              1      3
              7      3
              5      3
                 (count=3)
              6      6
              3      6
                 (count=2)
              2      1
                 (count=1)
              4      8
                 (count=1)

              Verständlich?

              Mike

          2. Hallo Mike,

            Ich bräuchte das GROUP BY eben nur für die ORDER BY-Klausel, nicht für den ganzen SELECT.
            *weiter wart*

            statt zu warten. solltest Du Dich mit SQL-Grundlagen beschäftigen.
            Joins, Subselects und Aggregatfunktionen in Zusammenhang mit der
            GROUP-BY-Klausel kämen mir in den Sinn.

            Eine extrem wichtige Information hast Du uns vorenthalten, obwohl Du
            bei der Auswahl Deines Themenbereiches extra darauf hingewiesen wurdest:

            die MySQL-Version, die Dir zur Verfügung steht.

            Ohne Angabe gehe ich von einer aktuellen Produktionsversion, 5.0.x, aus.

            Freundliche Grüße

            Vinzenz

            1. Ohne Angabe gehe ich von einer aktuellen Produktionsversion, 5.0.x, aus.

              richtig, wobei es auf allen neueren Versionen funktionieren sollte...

              Join gut und schön, aber auf was? Die selbe table?
              Wäre schön, wenn du mir ne Richtung geben könntest.

              Gruß Mike

              1. Hallo

                Ohne Angabe gehe ich von einer aktuellen Produktionsversion, 5.0.x, aus.
                richtig, wobei es auf allen neueren Versionen funktionieren sollte...

                was verstehst Du unter einer neueren Version?
                Teste unter der entsprechenden Version :-)

                Join gut und schön, aber auf was? Die selbe table?

                Fast. Sowas nennt man übrigens einen Selfjoin.

                Wäre schön, wenn du mir ne Richtung geben könntest.

                Du benötigst doch die Angabe, wie oft eine Gruppe vorkommt. Richtig? Wie Dir bereits gesagt wurde, ist es zwingend erforderlich, dass bei Verwendung einer Aggregatsfunktion über alle Spalten gruppiert (mit der GROUP-BY-Klausel) wird, auf die *keine* Aggregatsfunktion angewandt wird.

                MySQL ist in dieser Hinsicht etwas schlampig und wendet auf die Spalten, auf die der schlampige Statement-Ersteller keine Aggregatsfunktion angewandt hat die Aggregatsfunktion

                zufall(nicht gruppierte spalte)

                an. Sofern innerhalb der Gruppe stets gleiche Werte in dieser Spalte stehen, kommt sogar das gewünschte Ergebnis heraus. Aber das nur nebenbei, das hat mit Deinem Problem nur indirekt zu tun.

                Wie bekommst Du die Angabe, wie oft die Gruppen auftreten? Das geht bei den Daten aus Malcolms Beispiel mit [1]

                  
                SELECT                    -- Gib mir  
                    gruppe,               -- die Gruppen  
                    COUNT(gruppe) anzahl  -- und die Anzahl ihres Auftretens, die unter dem  
                                          -- netteren Aliasnamen anzahl ausgegeben werden soll  
                FROM                      -- aus  
                    tabelle               -- meiner Tabelle "tabelle"  
                GROUP BY                  -- gruppiert nach  
                    gruppe                -- der Spalte gruppe, d.h. je Gruppe gibt es genau  
                                          -- einen, den gewünschten Wert  
                
                

                liefert:

                gruppe | anzahl
                ---------------
                   1   |    1
                   3   |    3
                   6   |    2
                   8   |    1

                Das hättest Du ja bestimmt selbst hinbekommen.

                Für jeden Datensatz aus Deiner Ausgangstabelle benötigst Du nun den passenden Wert aus dieser Abfrage, d.h. den Wert aus anzahl für den die Gruppen übereinstimmen. Ganz logisch, das ist ein Join. Also musst Du die Ausgangstabelle mit dieser Abfrage (als temporären View) hier joinen:

                SELECT                        -- Gib mir  
                    t.id                      -- die id,  
                    t.gruppe                  -- die zugehörige Gruppe  
                    v.anzahl                  -- und die Anzahl ihres Auftretens  
                FROM                          -- aus der Tabelle  
                    tabelle t                 -- "tabelle", angesprochen über den Alias "t",  
                INNER JOIN (                  -- die mit folgender Abfrage  
                    SELECT                    --  
                        gruppe,               -- temporärer View (Definition siehe oben)  
                        COUNT(gruppe) anzahl  
                    FROM  
                        tabelle  
                    GROUP BY  
                        gruppe  
                    ) v                       -- die über den zwingend erforderlichen Alias  
                                              -- "v" angesprochen wird  
                ON                            -- über die Spalten  
                    t.gruppe = v.gruppe       -- gruppe beider "Tabellen" verknüpft ist  
                ORDER BY                      -- sortiert nach  
                    v.anzahl DESC             -- der Anzahl des Auftretens, absteigend  
                
                

                hat als Ergebnismenge:

                id | gruppe | anzahl
                --------------------
                 5 |    3   |    3
                 1 |    3   |    3
                 7 |    3   |    3
                 6 |    6   |    2
                 3 |    6   |    2
                 4 |    8   |    1
                 2 |    1   |    1

                Beachte, dass die Reihenfolge innerhalb einer Gruppe mit einer bestimmten Anzahl zufällig ist. Möchtest Du dort eine vorgegebene Reihenfolge haben, so musst Du auch danach sortieren (als zweite, dritte, ... Sortierspalte).

                Getestet unter MS SQL-Server 2005, hab' gerade kein MySQL zur Hand.

                Freundliche Grüße

                Vinzenz

                [1] Hi Malcolm, Du lernst schnell. Und verstehst vielleicht auch besser,
                    warum ich in solchen Fällen gerne nach einem Beispiel mit Beispieldaten
                    frage. Es macht das Verständnis viel einfacher.

                1. Hallo Vinzenz,

                  Vielen Dank für deine ausführliche Erklärung, hast mir sehr geholfen.

                  Wusste gar nicht, dass man eine Subquerry auch als join schreiben kann.

                  Nochmal vielen Dank euch allen,

                  Mike

                2. hi Vinzenz,

                  [1] Hi Malcolm, Du lernst schnell. Und verstehst vielleicht auch besser,
                      warum ich in solchen Fällen gerne nach einem Beispiel mit Beispieldaten
                      frage. Es macht das Verständnis viel einfacher.

                  Naja, mit dem lernen, langsam aber Sicher, zumindest läuft mein Frontend jetzt endlich mit mysqli :)  (jetzt habe ich noch die Admin-Baustelle vor mir)

                  Ich habe mir auch noch des öfteren meinen Thread angesehen, im nachhinein betrachtet kann ich dir nur zustimmen, meine Problembeschreibung war wirklich mehr als dürftig[1], und dass trotz mehrfacher Vorschau und Korrekturlesen, ich arbeite dran :)

                  mfg
                  [1] zum Glück blieben mir die Tipps für Fragende erspart, wobei ich den Link definitiv verdient hatte!  :)