schnalbi: zusammenfassen

habe eine tabelle 'user' mit folgenden feldern:

id, name, geburtsdatum

SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 16 YEAR);
SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 18 YEAR);
SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 54 YEAR);

also ich möchte die anzahl der user die über 16,über 18 und über 54 sind haben.
kann man das irgendwie in eine abfrage bekommen ??

vielen dank
schnalbi

  1. Hallo

    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 16 YEAR);
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 18 YEAR);
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 54 YEAR);

    kann man das irgendwie in eine abfrage bekommen ??

    Ja, ganz einfach mit UNION.

    Nahezu jedes mir bekannte Datenbankmanagementsystem  (DBMS) - die einzige
    Ausnahme ist das wirklich unfähige MySQL 3.x - kennt UNION. Schau also in der
    Dokumentation Deines DBMS, das Du uns freundlicherweise verschwiegen hast,  danach.

    Freundliche Grüße

    Vinzenz

    1. Danke für die schnellen antworten.

      also ich habe mysql 5.x

      wird die abfrage schneller, wenn ich die abfragen durch union verknüpfe ??

      1. Hi,

        naja, das eine ist eine Abfrage, das andere sind 3.

        Klar, eine grosse dauert laenger als eine kleine, aber eine grosse ist in diesem Fall schneller als eine kleine.

        Jeder Teil der neuen Query ist eine Query der alten, der Vorteil ist, dass du nur einmal zum Server musst, anstatt zuvor 3 mal.

        -> Ja, ist schneller

        1. vielen dank für die hilfe. werde es dann immer so machen.

          mfg
          schnalbi

          1. Soweit ich weiß, wird die Abfrage MySQL-intern eh nochmal von einem Optimierungsalgorithmus zerlegt.
            Daher sollte eine einzelne Abfrage meist die bessere Wahl sein.

  2. Hey,

    ungetestet, da ich kein MYSQL(?) habe.

    Sind zwar immernoch 3 queries, aber nur einmal vom Server und zurueck.

    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 16 YEAR)
    UNION
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 18 YEAR)
    UNION
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 54 YEAR)

    Ich denke aber, dass bei UEBER18 auch die aus UEBER16 dabei sind?

    Ist das gewollt?

  3. Huhu!

    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 16 YEAR);
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 18 YEAR);
    SELECT count(id) FROM user WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 54 YEAR);

    Ich würde das einfach so machen:

      
    SELECT count( id )  
    FROM user  
    WHERE geburtsdatum > DATE_SUB(NOW(), INTERVAL 16 YEAR  
    OR geburtsdatum > DATE_SUB(NOW(), INTERVAL 18 YEAR  
    OR geburtsdatum > DATE_SUB(NOW(), INTERVAL 54 YEAR  
    
    

    Das zählt allerdings alle zusammen und gibt nicht für die jeweiligen Jahre die einzelnen Anzahlen aus.

    ~ Thilo