Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Aus einer Mysql-Datenbank Altersgruppen anhand von Geburtsdaten abrufen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Aus einer Mysql-Datenbank Altersgruppen anhand von Geburtsdaten abrufen

    Hallo PHP-Gemeinde

    Ich versuche – schon ziemlich verkrampft - aus der Datenbank verschiedene Altersgruppen herauszufiltern. Mit einem PHP-Code wäre das sicher kein Problem, ich möchte es aber mit Mysql erreichen. Bisher jedoch ohne Erfolg.

    Meine Frage: Ist dies überhaupt in Mysql möglich oder ist die Syntax unrichtig?

    Mein Versuchs-Code sieht so aus:
    PHP-Code:
    $sql "SELECT COUNT(Geburtsdaten) AS 'Alter', Geburtsdaten
    FROM personen
    WHERE Geschlecht = 'm' and
    FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
    BETWEEN '18' AND '25' and
    FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
    BETWEEN '26' AND '40' and
    FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
    BETWEEN '41' AND '65' GROUP BY Geburtsdaten " 
    ;

    $resmysql_query($sql); echo mysql_error();
    while(
    $row mysql_fetch_array($res))

        { 
    $data[] =$row['Alter'] ;}

       echo 
    $data[0]."---".$data[1]."---".$data[2]; 
    Und liefert mir als Ergebnis drei Leerstellen zurück.

  • #2
    Was du willst, ist z.B. sowas:

    18-25 -> 35
    26-40 -> 40
    41-65 -> 18

    Also musst du im Ergebnisset zwei Arrayelemente haben:
    $row['altersbereich'] und
    $row['anzahl']

    anzahl kriegst du hin mit SELECT count(*) as anzahl. Den Altersbereich und die einzelnen Zeilen mit GROUP BY
    (pro Altersbereich eine Zeile, mysql_num_rows() ist also = 3)

    Kommentar


    • #3
      @Wolla

      Danke für die rasche Antwort. Ich bin zwar nicht sicher, ob ich alles richtig verstanden habe, werde aber gleich versuchen, es nach deinen Angaben nachzuvollziehen.

      Kommentar


      • #4
        @Wolla

        Den Altersbereich und die einzelnen Zeilen mit GROUP BY (pro Altersbereich eine Zeile, mysql_num_rows() ist also = 3)
        Das habe ich sicher falsch verstanden. So kann es sicher nicht gemeint sein?
        PHP-Code:
        $sql "SELECT COUNT(*) AS 'Anzahl'
        FROM personen
        WHERE Geschlecht_a = 'm'  and
        FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
        BETWEEN '18' AND '25' GROUP BY Geburtsdaten and
        FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
        BETWEEN '26' AND '40' GROUP BY Geburtsdaten and
        FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
        BETWEEN '41' AND '70' GROUP BY Geburtsdaten " 

        Denn da kommt die Reklamation:

        You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY Geburtsdaten and FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, ' at line 7

        Kommentar


        • #5
          GROUP BY gehört nur ein mal in eine Query.

          Kommentar


          • #6
            GROUP BY gehört nur ein mal in eine Query.
            So habe ich es auch zuerst gemacht. Offensichtlich habe ich den Rat von Wolla falsch verstanden.

            Aber egal, wenn ich nicht weiterkomme, so sortiere ich die Alters-Ausgaben anschließend mit php.

            Kommentar


            • #7
              Tipp:
              wenn du jeweils nach dem Geburtsjahr gruppieren möchtest, dann machst du:

              PHP-Code:
              $sql "SELECT 
                          COUNT(*) AS Anzahl,
                          DATE_FORMAT(`Geburtsdaten`, '%Y') AS Geburtsjahr
                      FROM 
                          personen
                      WHERE 
                          Geschlecht_a = 'm'
                      GROUP BY
                          DATE_FORMAT(`Geburtsdaten`, '%Y')"

              Das kannst du dir im PHPmyadmin ja mal anschauen, dann siehst du worauf es hinausläuft.

              Die Bereiche fummelst du dann bitte selbst rein - ich hab grade Denkpause.

              Kommentar


              • #8
                WHERE Geschlecht = 'm' and
                FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
                BETWEEN '18' AND '25' and
                FLOOR(((CURDATE() + 0) - DATE_FORMAT(`Geburtsdaten`, '%Y%m%d')) / 10000)
                BETWEEN '26' AND '40' GROUP BY Geburtsdaten and
                Ähm, hust, dass

                „Hole alle Männchen, die gleichzeitig 18 bis 25 Jahre und zwischen 26 und 40 sind“

                irgendwie nicht gehen kann, ist aber schon klar, ja?


                Zudem könnte man auch bequem in PHP die nötigen Zeitstempel der Altersgruppen vorberechnen und dann einfach ein paar Vergleiche fahren.

                Kommentar


                • #9
                  Schon klar:

                  Das umgangssprachliche 'Und' versteht der PC natürlich logischer als wir.
                  Ein 'Oder' wäre sinngemäßer aber auch nicht zielführend gewesen.

                  Ich lasse mir jetzt jeden Datensatz mit dem Alter ausgeben und sortiere anschließend mit PHP

                  Kommentar

                  Lädt...
                  X