Steffimon: Datenbankabfrage mit count() und group

Hallo,

ich habe eine Mysql Datenbank mit einer Tabelle 'tabelle' und einer Spalte 'spalte'.

in der Tabelle existieren belibig viele Datensätze.
In der Spalte 'spalte' steht jeweils ein String.

Bspl.:

spalte
hinz
kunz
bert
stef
kunz
arsch
hans
stef
stef
arsch
bert

Ich möchte nun eine Ausgabe erzielen, die nicht jeden Eintrag ausgiebt, sondern jeden gleichen String nur _einmal_. Dies kann ich per "SELECT spalte FROM tabelle GROUP BY spalte" erreichen.

Nun möchte ich aber noch ausgeben, wie oft jeder String vorhanden ist. Hierzu könnte ich count() verwenden.

Meine Frage nun: Wie kombiniere ich diese beiden Sachen?

Die Ausgabe soll folgendermaßen aussehen:

hinz 1
kunz 2
bert 2
stef 3
arsch 2
hans 1

Als Scriptsprache steht mit PHP zur Verfügung, falls man das nicht mit SQL hinbekommt.

vielen Dank für euere Hilfe

Steffi

  1. Hi,

    Nun möchte ich aber noch ausgeben, wie oft jeder String vorhanden ist. Hierzu könnte ich count() verwenden.

    ja, ganz genau.

    Meine Frage nun: Wie kombiniere ich diese beiden Sachen?

    Just do it. Es ist einfacher als Du denkst.

    Als Scriptsprache steht mit PHP zur Verfügung, falls man das nicht mit SQL hinbekommt.

    Ein Leichtes für SQL :-)

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Just do it. Es ist einfacher als Du denkst.

      Hi,

      vielen Dank! ich hab folgendes ausprobiert und es funktioniert:

      $query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte");

      Die Ausgabe mache ich folgendermaßen:

      while($query_array = mysql_fetch_array($query_return)) {
           echo $query_array[0]." ".$query_array[1]."<br>";
      }

      Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:

      $query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte ODER BY count(spalte) DESC");

      Dies funktioniert aber nicht.

      Wie kann ich nach der Anzahl der gefundenen Strings sortieren lassen?

      vielen Dank für Deine Hilfe

      Steffimon

      1. Hi,

        Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:

        vielleicht solltest Du weniger probieren und mehr Dokumentation lesen. Welches DBMS auch immer Du verwendest, es hat ganz sicher eine Definition der Syntax eines Select-Statements, der Du z.B. entnehmen kannst, in welcher Reihenfolge die GROUP BY- und die ORDER BY-Klauseln notiert werden müssen.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. vielleicht solltest Du weniger probieren und mehr Dokumentation lesen. Welches DBMS auch immer Du verwendest, es hat ganz sicher eine Definition der Syntax eines Select-Statements, der Du z.B. entnehmen kannst, in welcher Reihenfolge die GROUP BY- und die ORDER BY-Klauseln notiert werden müssen.

          Wo finde ich diese Doku?
          Ich hab die Reihenfolge vertauscht, funktioniert immernoch nicht?!

          1. Hi,

            Welches DBMS auch immer Du verwendest, es hat ganz sicher [...]
            Wo finde ich diese Doku?

            wie ich gerade sehe, hast Du irgendwo erwähnt, dass Du MySQL einsetzt. Die Doku findest Du immer beim Hersteller, in diesem Fall also bei http://www.mysql.com/.

            Ich hab die Reihenfolge vertauscht, funktioniert immernoch nicht?!

            "Funktioniert nicht" funktioniert nicht. Fehlerbeschreibung, bitte. Desweiteren war das nur ein Beispiel, kein Hinweis auf die Fehlerursache ;-)

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. "Funktioniert nicht" funktioniert nicht. Fehlerbeschreibung, bitte. Desweiteren war das nur ein Beispiel, kein Hinweis auf die Fehlerursache ;-)

              query:
              SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spalte

              fehlerbeschreibung:
              es werden keine datensätze abgefragt

              1. Hallo,

                Achtung dies ist keine Problemlösung.
                oRder By
                unten steht oder by

                SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spalte

                Odium

              2. Hi Steffimon,

                query:
                SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spalte

                fehlerbeschreibung:
                es werden keine datensätze abgefragt

                Du wirfst also die Meldung des Datenbanksystems, welche Dich auf Deinen Syntaxfehler hinweist, ungelesen weg? Keine gute Entscheidung - das macht das Finden von Fehlern generell schwieriger.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
      2. Hallo Steffimon,

        auch wenn ich Cheatah möglicherweise den Pädagogenspaß (ein Psychoanalytiker schlösse wohl auf "Perverses Ritual") verderbe - schau mal hier nach, wie das mit der ORDER-BY-Klausel geht: http://www.mysql.com/doc/en/SELECT.html.

        Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:

        $query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte ODER BY count(spalte) DESC");

        Dies funktioniert aber nicht.

        In Deinem Fall kannst Du ordnen nach einem Aliasnamen oder der Spaltenposition:

        SELECT spalte,COUNT(spalte)
             FROM blah
             GROUP blah
             ORDER BY anzahl_spalte DESC

        oder

        SELECT spalte,COUNT(spalte) AS anzahl_spalte
             FROM blah
             GROUP blah
             ORDER BY 2 DESC

        HTH Robert

        1. So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:

          SELECT spalte,COUNT(spalte) AS anzahl_spalte
                FROM blah
                GROUP blah
                ORDER BY anzahl_spalte DESC

          SELECT spalte,COUNT(spalte)
                FROM blah
                GROUP blah
                ORDER BY 2 DESC

          1. So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:

            Hallo srob,

            vielen Dank für Deine kompetente Hilfe. Es funktioniert nun.

            Schönen Tan noch

            Steffi

          2. So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:

            Eine Frage hab ich noch:

            Ich möchte nun nur die Strings abfragen, die mindestens 3x vorkommen. Ich habe versucht dies so zu lösen:

            SELECT spalte,COUNT(spalte) AS anzahl_spalte
            FROM blah
            WHERE anzahl_spalte > 2
            GROUP blah
            ORDER BY anzahl_spalte DESC

            funktioneirt aber nicht. Es werden keine Datensätze eingelesen?
            Wie muss das richtig heissen?

            viele Grüße

            Steffi

            1. Hallo Steffi,

              Ich möchte nun nur die Strings abfragen, die mindestens 3x vorkommen. Ich habe versucht dies so zu lösen:

              SELECT spalte,COUNT(spalte) AS anzahl_spalte
              WHERE anzahl_spalte > 2
              GROUP blah
              ORDER BY anzahl_spalte DESC

              kann so nicht gehen. Du möchtest die Ergebnismenge des SELECTs nach Anwendung der Aggregatfunktion filtern, dazu solltest Du Dir die HAVING-Klausel ansehen - das ist jetzt mein perverses Ritual ;-).

              HTH Robert

              1. kann so nicht gehen. Du möchtest die Ergebnismenge des SELECTs nach Anwendung der Aggregatfunktion filtern, dazu solltest Du Dir die HAVING-Klausel ansehen - das ist jetzt mein perverses Ritual ;-).

                aha, ok. Ich verstehe was Du meinst. Es ist nicht möglich nach was zu sortieren, was ich noch garnicht hab, da dies ja erst durch den Query gebildet wird.
                Was gibt es für Alternativen? Wie kann ich das lösen?

                vielen Dank

                Steffi

                1. Hallo Steffi,

                  aha, ok. Ich verstehe was Du meinst.

                  Möglicherweise nicht so ganz...

                  Es ist nicht möglich nach was zu sortieren, was ich noch garnicht hab, da dies ja erst durch den Query gebildet wird.
                  Was gibt es für Alternativen? Wie kann ich das lösen?

                  Wie gesagt: mit HAVING. Du selektierst Sätze, gruppierst zählend (aggregierst) sie nach dem Wert in "spalte" und mußt nun noch angeben, daß nur jene Sätze in die Ergebnismenge gruppiert werden sollen, bei denen die Summe größer ist als der von Dir gewünschte Wert - und das macht HAVING.

                  Vielleicht kommst Du besser mit der deutschen Doku zurecht: http://www.mysql.com/doc/de/SELECT.html.

                  HTH Robert