tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
416
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hallo,

    ich muss gerade ein Statement schreiben, wo ich von allen verkauften Autos, immer genau die drei beliebtesten Baujahre brauche. Das folgende Statement würde mir alle zurückgeben, also müsste es noch irgendwie modifiziert werden.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    SELECT
        autoid,
        baujahr,
        COUNT(baujahr) AS summary
    FROM
        (
            SELECT 1 AS id, 1 AS autoid, 1972 AS baujahr
            UNION SELECT 2 AS id, 1 AS autoid, 1973 AS baujahr
            UNION SELECT 3 AS id, 1 AS autoid, 1973 AS baujahr
            UNION SELECT 4 AS id, 1 AS autoid, 1973 AS baujahr
            UNION SELECT 5 AS id, 1 AS autoid, 1974 AS baujahr
            UNION SELECT 6 AS id, 1 AS autoid, 1974 AS baujahr
            UNION SELECT 7 AS id, 1 AS autoid, 1974 AS baujahr
            UNION SELECT 8 AS id, 1 AS autoid, 1974 AS baujahr
            UNION SELECT 9 AS id, 1 AS autoid, 1976 AS baujahr
            UNION SELECT 10 AS id, 2 AS autoid, 1974 AS baujahr
            UNION SELECT 11 AS id, 2 AS autoid, 1974 AS baujahr
            UNION SELECT 12 AS id, 2 AS autoid, 1974 AS baujahr
            UNION SELECT 13 AS id, 2 AS autoid, 1977 AS baujahr
            UNION SELECT 14 AS id, 2 AS autoid, 1977 AS baujahr
            UNION SELECT 15 AS id, 2 AS autoid, 1978 AS baujahr
        ) AS t1
    GROUP BY
        autoid,
        baujahr

    Gruß, Tommy
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ist ein wenig Tricki, aber mit Variablen durchaus lösbar.

    Zuerst das ganze noch nach der autoid und dem summary sortieren. Dann jede Resultatzeile mit der Vorzeile vergleichen und hochzählen solange die autoid gleich bleibt. Wenn die sich ändert, den Zähler zurücksetzen. Am Schluss das ganze noch filtern

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    SELECT
        autoid,
        baujahr,
        summary
    FROM
        (
            SELECT
                @counter := IF(autoid = @last_autoid, @counter+1, 1) AS counter,
                -- Hier ist die Anzahl der auszugebenden Resultate. In deinem Beispiel 3
                (@counter <= 3) AS flag,
                @last_autoid := autoid AS autoid,
                baujahr,
                summary
            FROM
                -- Die Variablen initialisieren
                (SELECT @last_autoid := 0, @counter :=0) AS vars,
                (
                    SELECT
                        autoid,
                        baujahr,
                        COUNT(*) AS summary
                    FROM
                        (
                            SELECT 1 AS id, 1 AS autoid, 1972 AS baujahr
                            UNION SELECT 2 AS id, 1 AS autoid, 1973 AS baujahr
                            UNION SELECT 3 AS id, 1 AS autoid, 1973 AS baujahr
                            UNION SELECT 4 AS id, 1 AS autoid, 1973 AS baujahr
                            UNION SELECT 5 AS id, 1 AS autoid, 1974 AS baujahr
                            UNION SELECT 6 AS id, 1 AS autoid, 1974 AS baujahr
                            UNION SELECT 7 AS id, 1 AS autoid, 1974 AS baujahr
                            UNION SELECT 8 AS id, 1 AS autoid, 1974 AS baujahr
                            UNION SELECT 9 AS id, 1 AS autoid, 1976 AS baujahr
                            UNION SELECT 10 AS id, 2 AS autoid, 1974 AS baujahr
                            UNION SELECT 11 AS id, 2 AS autoid, 1974 AS baujahr
                            UNION SELECT 12 AS id, 2 AS autoid, 1974 AS baujahr
                            UNION SELECT 13 AS id, 2 AS autoid, 1977 AS baujahr
                            UNION SELECT 14 AS id, 2 AS autoid, 1977 AS baujahr
                            UNION SELECT 15 AS id, 2 AS autoid, 1978 AS baujahr
                        ) AS t1
                    GROUP BY
                        autoid,
                        baujahr
                    ORDER BY
                        autoid,
                        COUNT(*) DESC
                ) AS myData
        ) AS flagged_fata
    WHERE
        flag = 1
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Wooow. Danke, das werde ich gleich mal testen und umschreiben.
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Achjam noch so als wichtige Info zum Umbau. Beim folgenden Teil ist die Reihenfolge wichtig. Ja nicht verdrehen
    Code sql:
    1
    2
    3
    4
    
                @counter := IF(autoid = @last_autoid, @counter+1, 1) AS counter,
                -- Hier ist die Anzahl der auszugebenden Resultate. In deinem Beispiel 3
                (@counter <= 3) AS flag,
                @last_autoid := autoid AS autoid,

    Naja, mindestesn muss der counter als erstes kommen. flag und autoid kannst du miteinander vertauschen
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. Jeder braucht sie irgendwann...
    Von c4dazubi08 im Forum 3D-Stills
    Antworten: 24
    Letzter Beitrag: 02.03.09, 21:35
  2. aus drei mach eins: drei ver. Quellen für ein SQL-Script, aber wie?
    Von abtronic im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 18.07.08, 23:32
  3. [MySQL] Hilfe bei SELECT Query über drei Tabellen
    Von -ben- im Forum Relationale Datenbanksysteme
    Antworten: 9
    Letzter Beitrag: 29.09.05, 20:50
  4. Jeder in seiner Lieblingssprache
    Von squeaker im Forum Fun-Forum
    Antworten: 19
    Letzter Beitrag: 07.07.04, 20:11
  5. SELECT aus drei Tabellen (etwas komplex)
    Von dayton im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 02.06.04, 09:36