verschiedene Altersgruppen prüfen

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

  • verschiedene Altersgruppen prüfen

    Hallo,

    Ich versuche mir gerade vergeblich eine SQL Abfrage zu erstellen.
    Ich möchte prüfen, ob User zwischen verschiedene Altersklassen vorhanden sind.

    Als Beispiel zwischen 18 und 30 Jahren.
    Zwischen 30 und 40 Jahren.
    Zwischen 40 und 50 Jahren.

    Mein Versuch sieht momentan so aus.
    PHP-Code:
    $sql "SELECT
                COUNT(geburtsdatum) 18_30
            FROM "
    .USER."
            WHERE
                geburtsdatum
                    BETWEEN DATE_SUB(CURDATE() ,INTERVAL 30 YEAR)
                    AND     DATE_SUB(CURDATE() , INTERVAL 18 YEAR)
            GROUP BY user_id
            LIMIT 1;"

    Würdet Ihr das auch so machen oder wie würdet ihr das lösen?

    Und ich kann so ja auch nur 1 Altersgruppe abfragen.
    Müßte ich jetzt für jede Altersgruppe (30 bis 40) und(40 bis 50) ein JOIN machen?
    Gut geraten ist halb gewußt.

  • #2
    Mit einem JOIN dachte ich das vielleicht so, aber das klappt nicht.

    PHP-Code:

    $sql 
    "SELECT
                COUNT(b.geburtsdatum) 18_30,
                COUNT(c.geburtsdatum) 30_40
            FROM "
    .USER." a
            LEFT JOIN "
    .USER." b
                ON b.user_id = a.user_id
                AND b.geburtsdatum
                BETWEEN DATE_SUB(CURDATE() ,INTERVAL 30 YEAR)
                AND     DATE_SUB(CURDATE() , INTERVAL 18 YEAR)
            LEFT JOIN "
    .USER." c
                ON c.user_id = a.user_id
                AND c.geburtsdatum
                BETWEEN DATE_SUB(CURDATE() ,INTERVAL 40 YEAR)
                AND     DATE_SUB(CURDATE() , INTERVAL 30 YEAR)
            GROUP BY a.user_id
            LIMIT 1;"

    Was ist daran falsch?
    Gut geraten ist halb gewußt.

    Kommentar


    • #3
      Was ist daran falsch?
      Du willst du Gruppen ja nicht Joinen, sonder Vereinen (UNION).

      Kommentar


      • #4
        Aha. Ja danke für den Tipp.
        Aber ansonsten ist die einzelne Abfrage richtig?
        PHP-Code:
        $sql "SELECT
                    COUNT(geburtsdatum) 18_30
                FROM "
        .USER."
                WHERE
                    geburtsdatum
                        BETWEEN DATE_SUB(CURDATE() ,INTERVAL 30 YEAR)
                        AND     DATE_SUB(CURDATE() , INTERVAL 18 YEAR)
                GROUP BY user_id
                LIMIT 1;"

        Oder gibt es da noch eine Verbesserung?

        Wenn ich ein UNION mit 4 Abfragen mache, wäre es ja fast so als wenn ich die 4 Abfragen einzeln mache? Oder ist sowas deutlich schneller?
        Gut geraten ist halb gewußt.

        Kommentar


        • #5
          Hey...

          also ich würde es anders regeln, du willst ja alle Gruppen gleichzeitig bekommen.

          Code:
          SELECT
                 COUNT( 
                       if(geburtsdatum 
                          BETWEEN DATE_SUB(CURDATE() ,INTERVAL 18 YEAR)
                          AND DATE_SUB(CURDATE() , INTERVAL 30 YEAR)
                         ,1, NULL)) AS 18_30,
                 COUNT( 
                       if(geburtsdatum 
                          BETWEEN DATE_SUB(CURDATE() ,INTERVAL 30 YEAR)
                          AND DATE_SUB(CURDATE() , INTERVAL 40 YEAR)
                         ,1, NULL)) AS 30_40,
                 COUNT( 
                       if(geburtsdatum 
                          BETWEEN DATE_SUB(CURDATE() ,INTERVAL 40 YEAR)
                          AND DATE_SUB(CURDATE() , INTERVAL 50 YEAR)
                          ,1, NULL)) AS 40_50
                  FROM ".USER."
                  GROUP BY user_id
                  LIMIT 1;
          Zuletzt geändert von case; 07.07.2008, 13:18.
          signed oder unsigned... das ist hier die Frage

          Kommentar


          • #6
            Ja. Ich glaube die COUNT(IF( - alternativ SUM(IF( Variante ist hier im Forum öffters aufgetreten. Ob UNION oder die IF Variante besser ist, sollte man einfach mal schnell testen.

            Kommentar


            • #7
              Sieht nicht schlecht aus. Danke ich werde das mal probieren.
              Gut geraten ist halb gewußt.

              Kommentar


              • #8
                Also das geht irgendwie nicht,
                PHP-Code:
                $sql "SELECT
                           COUNT(
                                 if(geburtsdatum
                                    BETWEEN DATE_SUB(CURDATE() ,INTERVAL 18 YEAR)
                                    AND DATE_SUB(CURDATE() , INTERVAL 30 YEAR)
                                   ,1, 0)) 18_30,
                           COUNT(
                                 if(geburtsdatum
                                    BETWEEN DATE_SUB(CURDATE() ,INTERVAL 30 YEAR)
                                    AND DATE_SUB(CURDATE() , INTERVAL 40 YEAR)
                                   ,1, 0)) 30_40,
                           COUNT(
                                 if(geburtsdatum
                                    BETWEEN DATE_SUB(CURDATE() ,INTERVAL 40 YEAR)
                                    AND DATE_SUB(CURDATE() , INTERVAL 50 YEAR)
                                    ,1, 0)) 40_50
                            FROM "
                .USER."
                            GROUP BY user_id
                            LIMIT 1;"

                Es kommt immer 1 raus.
                Gut geraten ist halb gewußt.

                Kommentar


                • #9
                  Warum verwendest du LIMIT 1?
                  Warum verwendest du GROUP BY user_id?

                  Kommentar


                  • #10
                    Wahrscheinlich, weil ich es oben in dem was ich geschrieben hatte aus seinem vorherigen Query einfach mal übernommen hatte, da ich nur das Prinzip des COUNT(IF zeigen wollte und über den rest des Querys nicht mehr nachgedacht habe.... darauf kann man aber auch kommen^^

                    Das muss natürlich raus und im else-Teil der if-condition muss keine 0 sondern ein NULL hin. Es sei denn du machst statt dem COUNT ein SUM.... Wein eine 0 wird auch mitgecounted. Ein NULL-Wert allerdings nicht.....

                    Wenn ein wert Abgefragt wird und dann die If-condition immer gezählt wird, dann kommt natürlich auch immer 1 raus....
                    signed oder unsigned... das ist hier die Frage

                    Kommentar


                    • #11
                      Ja, das hatte ich gesehen. Ich wollte nur nochmal die Bestätigung hören, dass sich mal wieder keinerlei Gedanken um die Funktionsweise gemacht wurden. Programmieren ist doch synonym zu Copy&Paste?

                      OffTopic:
                      Erinnert mich irgendwie an die Root-Foren, wo sich solche Leute regelmäßig ihre Kisten zerschießen, weil Sie code stupide kopieren.

                      Kommentar


                      • #12
                        Ok, ich hab verstanden.

                        Aber aus dem Grunde hatte ich ja auch gefragt, wenn ich alles wüßte, wäre ich auch kaum hier im Forum.

                        Das mit NULL und 0 wußte ich bis jetzt auch noch nicht.
                        Danke.
                        Gut geraten ist halb gewußt.

                        Kommentar

                        Lädt...
                        X