Melina: Größte Städte ausgeben

Guten Morgen,

zuerst ein frohes neues Jahr 2015 und vielen Dank für die Hilfe in 2014. Nun zu meiner Frage. Ich habe in meiner MySQL Datenbank eine Spalte „kontaktanzeigen“ mit einem Feld Ort (natürlich noch weiter, die sind hier aber erstmal nicht wichtig). Nun möchte ich auf meiner Startseite eine kleine Abfrage einbauen um mir die „größten“ Städte anzeigen zu lassen, also wo am meisten Einträge vorhanden sind.

Also z.B. so

Köln:    94 Anzeigen
Hamburg: 88 Anzeigen
München: 73 Anzeigen
Berlin:  56 Anzeigen

Wie müsste ich hier vorgehen? Mit einem einfachen

  
SELECT  *  
FROM   `kontaktanzeigen`  

komme ich hier nicht weiter, es muss bestimmt etwas mit WHERE zu tun haben?

  1. Moin moin,

    Ich habe in meiner MySQL Datenbank eine Spalte „kontaktanzeigen“ mit einem Feld Ort

    so wie es sich anhört, hast du eher eine Tabelle "kontaktanzeigen" mit einer Spalte "Ort".

    Nun möchte ich auf meiner Startseite eine kleine Abfrage einbauen um mir die „größten“ Städte anzeigen zu lassen, also wo am meisten Einträge vorhanden sind.

    ORDER BY, eventuell kombiniert mit LIMIT, wenn du z.B. nur die 5 mit der höchsten Anzahl willst.

    es muss bestimmt etwas mit WHERE zu tun haben?

    Eher nicht. Für WHERE müsstest du eine klar formulierbare Bedingung haben, die für jeden Datensatz gelten soll. Das hast du aber hier nicht (zumindest nicht für dieses Teilproblem).

    So long,
     Martin

    --
    Die neue E-Mailadresse des Papstes: mailto:urbi@orbi
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Tach!

      so wie es sich anhört, hast du eher eine Tabelle "kontaktanzeigen" mit einer Spalte "Ort".

      Nun möchte ich auf meiner Startseite eine kleine Abfrage einbauen um mir die „größten“ Städte anzeigen zu lassen, also wo am meisten Einträge vorhanden sind.
      ORDER BY, eventuell kombiniert mit LIMIT, wenn du z.B. nur die 5 mit der höchsten Anzahl willst.

      Und ich vermute auch noch ein GROUP BY sowie ein COUNT().

      Zu beachten ist dabei, dass nur die in der GROUP-BY-Klausel angegebenen Spalten im SELECT auftauchen dürfen - wenn man es richtig macht, MySQL gestattet auch andere Spalten, aber dann ist das Ergebnis zufällig. Weiterhin kann man Aggregatfunktionen verwenden, wie das erwähnte COUNT().

      SELECT Ort, COUNT(*) FROM tabelle GROUP BY Ort

      dedlfix.

      1. Hallo,

        Zu beachten ist dabei, dass nur die in der GROUP-BY-Klausel angegebenen Spalten im SELECT auftauchen dürfen - wenn man es richtig macht, MySQL gestattet auch andere Spalten, aber dann ist das Ergebnis zufällig. Weiterhin kann man Aggregatfunktionen verwenden, wie das erwähnte COUNT().

        SELECT Ort, COUNT(*) FROM tabelle GROUP BY Ort

        ich habe es nun so umgesetzt:

          
        $sql = "  
        SELECT 	ort, COUNT(*)  
        FROM   `kontaktanzeigen`  
        WHERE online = '1'  
        GROUP BY ort  
        Limit 5  
        ";
        

        Wenn ich mir das $sql ausgebe, sehe ich folgendes:

        SELECT ort, COUNT(*) FROM kontaktanzeigen WHERE online = '1' GROUP BY ort Limit 5 Aachen Albstadt Altlandsberg OT Gielsdorf Aschaffenburg Augsburg

        Diese Ausgabe ich nicht war. Gehe ich nun in meine Datenbank und suche nach Aachen da dieses ja laut der Abfrage die Stadt mit den meisten Einträge sein soll, sagt mir PHPMyAdmin folgendes:

        "MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze). (Die Abfrage dauerte 0.0007 Sekunden.)"

        Suche ich nach Berlin findet er z.B. 4 Einträge. Berlin taucht oben allerdings überhaupt nicht auf. Irgendwo ist hier noch ein Fehler.

        1. Tach!

          Wenn ich mir das $sql ausgebe, sehe ich folgendes:
          SELECT ort, COUNT(*) FROM kontaktanzeigen WHERE online = '1' GROUP BY ort Limit 5 Aachen Albstadt Altlandsberg OT Gielsdorf Aschaffenburg Augsburg
          Diese Ausgabe ich nicht war.

          Arbeitet wie GROUP BY im Handbuch beschrieben ist. Die Ausgabe ist sortiert nach ort, weil danach gruppiert wurde. Wenn du nach dem Wert von COUNT() sortieren willst, musst du eine entsprechende ORDER-BY-Klausel hinzufügen. MySQL kann ja nicht raten, was du das gern hättest.

          Gehe ich nun in meine Datenbank und suche nach Aachen da dieses ja laut der Abfrage die Stadt mit den meisten Einträge sein soll, sagt mir PHPMyAdmin folgendes:
          "MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze). (Die Abfrage dauerte 0.0007 Sekunden.)"

          Unabhängig von der Sortierung, wenn Aachen ausgegeben wird, dann ist es mindestens einmal in ort enthalten. Da kann kein leeres Resultat geliefert werden. Du machst da garantiert was verkehrt.

          dedlfix.

          1. Hallo,

            Arbeitet wie GROUP BY im Handbuch beschrieben ist. Die Ausgabe ist sortiert nach ort, weil danach gruppiert wurde. Wenn du nach dem Wert von COUNT() sortieren willst, musst du eine entsprechende ORDER-BY-Klausel hinzufügen. MySQL kann ja nicht raten, was du das gern hättest.

            hab es nun wie folgt geändert:

              
            $sql = "  
            SELECT 	ort, COUNT(ort) anzahl  
            FROM   `kontaktanzeigen`  
            WHERE online = '1'  
            GROUP BY ort  
            ORDER by anzahl DESC  
            Limit 5  
            ";  
            
            

            Als Ergebnis habe ich nun dieses:

            SELECT ort, COUNT(ort) anzahl FROM anzeigen WHERE online = '1' GROUP BY ort ORDER by anzahl DESC Limit 5

            Berlin (30)
            HAMBURG (16)
            Köln (12)
            München (8)
            Dortmund (7)

            Sieht schon etwas besser aus. Nur was mich wundert, wenn ich den Wert "Berlin" nehme damit in PHPMyAdmin in die Tabelle "kontaktanzeigen" gehe dann auf suchen klicke und "Berlin" in das Feld Ort einfüge, dann auf suche klicke, erhalte ich nur 4 Einträge. Wie kann das sein? Wenn ich mir alle Einträge anzeigen lasse, dann sehe ich in der Übersicht allerdings mehr als 4 Einträge. Irgendwas stimmt da wohl mit PHPMyAdmin nicht bzw. mit der suche?!

            1. Hallo,

              zu meinem Beitrag von gerade. Ich habe ja gesagt ich würde unterschiedliche Werte bekommen, ich dachte erst es hat etwas mit

              SELECT ort, COUNT(ort) anzahl FROM anzeigen WHERE online = '1' GROUP BY ort ORDER by anzahl DESC Limit 5

              oder auch

              SELECT ort, COUNT(ort) anzahl FROM kontaktanzeigen WHERE online = '1' GROUP BY ort ORDER by anzahl DESC Limit 5

              zu tun, aber "anzeigen" oder "kontaktanzeigen" liefern die gleiche Fehler!

            2. Tach!

              Sieht schon etwas besser aus. Nur was mich wundert, wenn ich den Wert "Berlin" nehme damit in PHPMyAdmin in die Tabelle "kontaktanzeigen" gehe dann auf suchen klicke und "Berlin" in das Feld Ort einfüge, dann auf suche klicke, erhalte ich nur 4 Einträge. Wie kann das sein?

              Der phpMyAdmin zeigt dir die Query, die er aufgrund des Suchformulars erstellt. Da muss irgendwas komisches drin sein. Ansonsten macht der ja auch nichts anderes, als Anfragen an den MySQL-Server zu stellen. Wenn unterschiedliche Ergebnisse rauskommen, waren die Anfragen unterschiedlich.

              dedlfix.

              1. Hallo,

                Der phpMyAdmin zeigt dir die Query, die er aufgrund des Suchformulars erstellt. Da muss irgendwas komisches drin sein. Ansonsten macht der ja auch nichts anderes, als Anfragen an den MySQL-Server zu stellen. Wenn unterschiedliche Ergebnisse rauskommen, waren die Anfragen unterschiedlich.

                ich glaube ich habe den Fehler gefunden. Wenn ich im PHPMyAdmin auf den Punkt suche klicke, ist standardmäßig "like" eingestellt, füge ich nun Berlin ein werden nur 5 gefunden. Ändere ich den Eintrag auf "=" dann werden auch alle gefunden.

  2. Guten Morgen,

    ich möchte meine Seite etwas erweitern und zwar lese ich mit diesem Code:

      
    $anzeigenrechts = array();  
    $sql = "  
    SELECT 	ort, COUNT(ort) anzahl  
    FROM   `anzeigen`  
    WHERE online = '1'  
    GROUP BY ort  
    ORDER by anzahl DESC  
    Limit 5  
    ";  
    
    

    die größten Städte aus. Soweit klappt das auch sehr gut. Nun möchte ich gerne zu jeder Stadt die aufgelistet wird, die 5 neuesten Anzeigen mit anzeigen lassen. Meine Idee ist, dass ich innerhalb von meiner Schleife:

      
    while ($row = mysql_fetch_object($res))  
    {  
      $anzeigenrechts[] = $row;  
    }  
    foreach ($anzeigenrechts as $anzeigenrechts)  
    {  
      ?>  
                <?php echo $anzeigenrechts->ort; ?> (<?php echo $anzeigenrechts->anzahl; ?>)<br>  
                <?php  
    }  
    ?  
    
    

    nochmals ein SQL schreibe, wo ich dann die passende Stadt im WHERE abfrage. Ist dieses Vorgehen OK, oder komme ich schon im ersten SQL an meine Daten die ich benötige?

    1. Tach!

      ich möchte meine Seite etwas erweitern und zwar lese ich mit diesem Code: [...]
      die größten Städte aus. [...] Nun möchte ich gerne zu jeder Stadt die aufgelistet wird, die 5 neuesten Anzeigen mit anzeigen lassen.

      Das ist ein nicht ganz seltener Wunsch. Man hat ein paar Datensätze und möchte aus einer anderen Tabelle jeweils x Datensätze zu jedem einzelnen. Dazu ist mir keine reine (My)SQL-Lösung bekannt. LIMIT wirkt immer erst am Ende und nicht schon beim JOIN, wobei da das Limit bei der Verknüpfungsbedingung gebraucht werden würde, à la FROM x JOIN y ON (x.foo = y.bar LIMIT 5). Aber das gibt es ja nicht.

      Meine Idee ist, dass ich innerhalb von meiner Schleife: [...]
      nochmals ein SQL schreibe, wo ich dann die passende Stadt im WHERE abfrage. Ist dieses Vorgehen OK, oder komme ich schon im ersten SQL an meine Daten die ich benötige?

      Du wirst vermutlich keine andere Lösung präsentiert bekommen.

      dedlfix.