Sepp-AC: MYSQL Abfrage - count /group by

Hallo,

ich sitze gerade an einer Abfrage und komme nicht so recht weiter.
Ich habe einen Datenbank mit ca. 2000 Einträgen - u.a mit Postleitzahlen aus Deutschland.

Nun würde ich gerne ausgeben wieviele Einträge aus dem PLZ-Bereich beginnend mit "01" sind.

Und das ganze für alle PLZ-Bereiche in Deutschland. Aber nicht in einer Schleife - brauche die Ausgaben an verschiedenen stellen.

Habe bereits versucht das ganze mittels ARRAY zu lösen:

  
$plz_all = array();  
$query="SELECT plz from tabelle";  
$result=mysql_query($query,$db);  
  
while($row = mysql_fetch_array($result))  
{  
   $plz_all[] = $row['plz'];  
}  
  
echo count(array_keys($plz_all, "01.%"));  

Das klappt aber leider nicht da ich keinen "Platzhalter" (%) in dieser Funktion angeben kann.

Freue mich über den ein oder andenen Tipp

  1. Mahlzeit Sepp-AC,

    Ich habe einen Datenbank mit ca. 2000 Einträgen

    ... aber leider vergessen anzugeben, *welche* Datenbank in *welcher* Version Du hast. Dabei hast Du extra einen entsprechenden Hinweis erhalten. Möchtest Du, dass wir raten müssen?

    • u.a mit Postleitzahlen aus Deutschland.

    FROM tabelle

    Nun würde ich gerne ausgeben wieviele Einträge

    SELECT [link:http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_substring@title=substring](plz, 0, 2) AS plz_bereich  
    ,      count(*) AS anzahl
    

    aus dem PLZ-Bereich beginnend mit "01" sind.

    Und das ganze für alle PLZ-Bereiche in Deutschland. Aber nicht in einer Schleife - brauche die Ausgaben an verschiedenen stellen.

    GROUP BY substring(plz, 0, 2)

    Habe bereits versucht das ganze mittels ARRAY zu lösen:

    Wenn Du ein Datenbank-Problem hast - was macht dann PHP-Code in Deinem Beitrag?

    Das klappt aber leider nicht da ich keinen "Platzhalter" (%) in dieser Funktion angeben kann.

    Das brauchst Du ja auch nicht ... schließlich willst Du sinnvollerweise ja bereits auf Datenbankebene zusammensuchen, aggregieren und summieren - dafür ist eine Datenbank schließlich da.

    Vielleicht kannst Du ja mit den SQL-Bruchstücken etwas anfangen. ;-)

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Vielen Dank für eure Antworten.

      Ich habe nun mal "Nach EKKi Art" versucht das ganze umzusetzen.
      Leider bekomme ich aber keine Ausgabe hin.

        
      $query="SELECT substring(plz, 0, 2) AS plz_bereich, count(*) AS anzahl from tabelle GROUP BY substring(plz, 0, 2) ";  
      $result=mysql_query($query,$db);  
      while ($row = mysql_fetch_assoc($result))  
      {  
      echo $xyz[$row['plz_bereich']] = $row['anzahl'];  
      }  
      
      

      Als Ausgabe bekommme ich nur die Zahl 1500 => das ist die gesamtzahl der Einträge meiner DB => übrigens eine MySQL 5.0.32

      Vielleicht hat noch jemand nen Ansatz für mich?

      Sepp

      1. Mahlzeit Sepp-AC,

        Leider bekomme ich aber keine Ausgabe hin.

        Hast Du die Abfrage mal direkt auf der Datenbank (ggf. auch mittels einem Hilfsmittel wie phpMyAdmin) ausprobiert? Was ist das Ergebnis?

        $query="SELECT substring(plz, 0, 2) AS plz_bereich, count(*) AS anzahl from tabelle GROUP BY substring(plz, 0, 2) ";
        $result=mysql_query($query,$db);
        while ($row = mysql_fetch_assoc($result))
        {
        echo $xyz[$row['plz_bereich']] = $row['anzahl'];
        }

        Das ist dann aber kein Datenbank- sondern ein PHP-Problem. Und Dein offensichtlichstes Problem ist, dass Du hier munter mit irgendwelchen Variablen herumfrickelst und Werte zuweist ... aber nirgendwo eine gescheite Ausgabe zusammenstellst. Was genau - erwartest Du - soll das echo denn ausgeben?

        Vielleicht hat noch jemand nen Ansatz für mich?

        Der Ansatz ist richtig, die Ausführung ist mangelhaft.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Mahlzeit Sepp-AC,

          Leider bekomme ich aber keine Ausgabe hin.

          Hast Du die Abfrage mal direkt auf der Datenbank (ggf. auch mittels einem Hilfsmittel wie phpMyAdmin) ausprobiert? Was ist das Ergebnis?

          plz_bereich wird mir leer angezeigt, anzahl wird 1500 angezeigt => in phpmyadmin

          $query="SELECT substring(plz, 0, 2) AS plz_bereich, count(*) AS anzahl from tabelle GROUP BY substring(plz, 0, 2) ";
          $result=mysql_query($query,$db);
          while ($row = mysql_fetch_assoc($result))
          {
          echo $xyz[$row['plz_bereich']] = $row['anzahl'];
          }

          Das ist dann aber kein Datenbank- sondern ein PHP-Problem. Und Dein offensichtlichstes Problem ist, dass Du hier munter mit irgendwelchen Variablen herumfrickelst und Werte zuweist ... aber nirgendwo eine gescheite Ausgabe zusammenstellst. Was genau - erwartest Du - soll das echo denn ausgeben?

          Vielleicht hat noch jemand nen Ansatz für mich?

          Der Ansatz ist richtig, die Ausführung ist mangelhaft.

          MfG,
          EKKi

          1. Hallo,

            Hast Du die Abfrage mal direkt auf der Datenbank (ggf. auch mittels einem Hilfsmittel wie phpMyAdmin) ausprobiert? Was ist das Ergebnis?

            plz_bereich wird mir leer angezeigt, anzahl wird 1500 angezeigt => in phpmyadmin

            welchen Datentyp hat Deine Postleitzahl-Spalte?
            Sie sollte vom Typ VARCHAR() sein. Ist es eine Integer-Spalte, dann hast Du einen Datentyp gewählt, der für Postleitzahlen ungeeignet ist.

            Freundliche Grüße

            Vinzenz

            1. Hallo,

              Hast Du die Abfrage mal direkt auf der Datenbank (ggf. auch mittels einem Hilfsmittel wie phpMyAdmin) ausprobiert? Was ist das Ergebnis?

              plz_bereich wird mir leer angezeigt, anzahl wird 1500 angezeigt => in phpmyadmin

              welchen Datentyp hat Deine Postleitzahl-Spalte?
              Sie sollte vom Typ VARCHAR() sein. Ist es eine Integer-Spalte, dann hast Du einen Datentyp gewählt, der für Postleitzahlen ungeeignet ist.

              Ich hatte es mal als Interger-nun aber wieder als VARCHAR().
              Bekomme diese Ausgabe einfach nicht hin...

              Auch var_dum bringt mich nicht weiter:

              array(4) { [0]=> string(0) "" ["plz_bereich"]=> string(0) "" [1]=> string(4) "1500" ["anzahl"]=> string(4) "1500" }

              Freundliche Grüße

              Vinzenz

              1. Hallo,

                welchen Datentyp hat Deine Postleitzahl-Spalte?
                Sie sollte vom Typ VARCHAR() sein. Ist es eine Integer-Spalte, dann hast Du einen Datentyp gewählt, der für Postleitzahlen ungeeignet ist.

                Ich hatte es mal als Interger-nun aber wieder als VARCHAR().
                Bekomme diese Ausgabe einfach nicht hin...

                Auch var_dum bringt mich nicht weiter:

                array(4) { [0]=> string(0) "" ["plz_bereich"]=> string(0) "" [1]=> string(4) "1500" ["anzahl"]=> string(4) "1500" }

                bevor Du irgendwelches PHP ins Spiel bringst (außer eventuell für Deinen DB-Client), bring' das Statement in Ordnung:

                Im ersten Schritt schneiden wir uns die ersten zwei Zeichen Deiner PLZ aus:

                SELECT DISTINCT  
                    LEFT(plz, 2) Bereich  
                FROM  
                    tabelle  
                LIMIT 5  
                
                

                gern auch alternativ mit dem von EKKi vorgeschlagenen SUBSTRING:

                SELECT DISTINCT  
                    [link:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr@title=SUBSTRING](plz, 0, 2) Bereich  
                FROM  
                    tabelle  
                LIMIT 5  
                
                

                Wenn dies vernünftige Ergebnisse liefert, kannst Du weitermachen.

                Ach so: ich halte herzlich wenig davon, Tabellen- und Spaltennamen für Forumsbeiträge zu ändern :-) Das ist die Quelle vieler Fehler und Missverständnisse.

                Freundliche Grüße

                Vinzenz

                1. Hallo Ingrid,

                  bevor Du irgendwelches PHP ins Spiel bringst (außer eventuell für Deinen DB-Client), bring' das Statement in Ordnung:

                  Im ersten Schritt schneiden wir uns die ersten zwei Zeichen Deiner PLZ aus:

                  SELECT DISTINCT

                  LEFT(plz, 2) Bereich
                  FROM
                      tabelle
                  LIMIT 5

                    
                  
                  > gern auch alternativ mit dem von EKKi vorgeschlagenen SUBSTRING:  
                    
                  hier liegt der Hase im Pfeffer:  
                    
                  ~~~sql
                  SELECT DISTINCT  
                      [link:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr@title=SUBSTRING](plz, 1, 2) Bereich  
                  FROM  
                      tabelle  
                  LIMIT 5  
                  
                  

                  SUBSTRING in MySQL zählt die Zeichen ab 1, nicht ab 0.

                  Somit kommen wir zu

                  SELECT  
                      SUBSTRING(plz, 1, 2) Bereich,  
                      COUNT(*) Anzahl  
                  FROM  
                      tabelle  
                  GROUP BY  
                      SUBSTRING(plz, 1, 2)  
                  
                  

                  wobei MySQL es (als Erweiterung zum SQL-Standard) zulässt, nach einem Spaltenalias zu gruppieren:

                  SELECT  
                      SUBSTRING(plz, 1, 2) Bereich,  
                      COUNT(*) Anzahl  
                  FROM  
                      tabelle  
                  GROUP BY  
                      Bereich  
                  
                  

                  Freundliche Grüße

                  Vinzenz

                  1. Hallo zusammen,

                    also die Abfrage aus der MySQL Datenbank funktioniert jetzt-zumindest in phpmyadmin.

                    Wie bekomme ich die Daten denn nun ausgegeben? Ich frage weil ich wirklich nicht weiter komme.

                    Versuche diese in einem Array zu speichern und dann auszugeben-leider erfolglos:

                      
                    $query="SELECT DISTINCT LEFT(plz, 2) bereich, COUNT(LEFT(plz, 2)) anzahl FROM tabelle GROUP BY LEFT(plz, 2) ";  
                    $result=mysql_query($query,$db);  
                    while($row = mysql_fetch_array($result));  
                    {  
                    $arr[] = $row;  
                      
                    }  
                    echo $arr['bereich']['anzahl'];  
                    
                    
                    1. Hi!

                      echo $arr['bereich']['anzahl'];

                      Wie sieht denn der Inhalt von $arr aus? Wie eine Kontrollausgabe ging, hast du ja im vorigen Posting schon gewusst. Wenn du die auch noch mit einem vorangehenden <pre> ausgibst, wird sie sogar noch lesbarer, weil dann die Struktur von Arrays besser zu erkennen ist. Alternativ geht auch ein Blick in die Quelltextansicht des Browsers.

                      Lo!

                      1. Danke an alle!

                        habe die Lösung gefunden und strahle im Gesicht:

                          
                        $query="SELECT DISTINCT LEFT(plz, 2) bereich, COUNT(LEFT(plz, 2)) anzahl FROM tabelle GROUP BY LEFT(plz, 2) ";  
                        $result=mysql_query($query,$db);  
                        while ($row = mysql_fetch_assoc($result)) {  
                        $plz_all[$row['bereich']] = $row['anzahl'];  
                        }  
                        echo $plz_all['02']; // Die entsprechende Anzahl  
                        
                        

                        Vielen Dank

                        Sepp

                  2. Mahlzeit Vinzenz Mai,

                    SUBSTRING in MySQL zählt die Zeichen ab 1, nicht ab 0.

                    Ooops, hab ich glatt übersehen - sorry! (So ist das, wenn's substring() in so vielen verschiedenen Sprachen gibt ... *g*)

                    MfG,
                    EKKi

                    --
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hallo,

    wende doch einfach das an, was Du in Deinem Betreff geschrieben hast :-)

    SELECT plz from tabelle

    Gruppiere und zähle über die Teilzeichenkette mit den ersten zwei Zeichen.
    Dabei hilft Dir die Funktion LEFT():

    SELECT  
        LEFT(plz, 2) Bereich,       -- die PLZ-Bereiche, wenn die Postleitzahlen  
                                    -- aus einem Land sind und kein Präfix haben  
        COUNT(LEFT(plz, 2)) Anzahl  -- und zähle ihr Vorkommen  
    FROM  
        tabelle  
    GROUP BY  
        LEFT(plz, 2)                -- für jeden (vorhandenen) Bereich eine Zeile.  
    
    

    Berücksichtigt natürlich nur den Gut-Fall. Ich hoffe, Deine Daten sind entsprechend sauber :-) Falls Du mehrere Länder berücksichtigen musst, wird's halt komplizierter.

    Mit PHP hat das ganze natürlich nichts zu tun ...

    Freundliche Grüße

    Vinzenz