tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
361
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Hi Leute

    Ich habe ein Problem mit einer Abfrage:
    Ich möchte aus einer Tabelle den grössten und den zweitgrössten Wert gleichzeitig mit einem SELECT aus der selben Spalte abfragen.

    Meine Tabellen sehen folgendermassen aus:
    In der Tabelle "swauditlogs" gibt es die Spalte "dateline". Von dieser Spalte "dateline" möchte ich den grössten und zweitgrössten Wert für die jeweilige "ticketmaskid" aus der Tabelle "swtickets" erhalten.

    Dies ist meine Abfrage wie ich sie bis jetzt zusammen habe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    SELECT MAX(`swauditlogs`.dateline) AS last_response, `swtickets`.ticketmaskid FROM `swauditlogs`
    JOIN `swtickets` ON `swauditlogs`.ticketid = `swtickets`.ticketid
    WHERE `swauditlogs`.ticketid = `swtickets`.ticketid
    AND `swtickets`.ticketstatusid = 1
    AND `swtickets`.departmentid = 1
    AND `swauditlogs`.actiontype = 12
    GROUP BY `swtickets`.ticketmaskid

    Mit MAX() bekomme ich ja den grössten wert der Spalte "dateline" in der Tabelle "swauditlogs" zurück.

    Jetzt möchte ich aber in der gleichen Abfrage auch noch den zweitgrössten Wert zurückbekommen.

    Ich habe noch eine Abfrage mit der ich den zweitgrössten Wert erhalte:
    Code :
    1
    2
    3
    4
    5
    
    SELECT dateline AS second_last_response FROM `swauditlogs`
    WHERE ticketid = 4744
    AND actiontype = 12
    ORDER BY dateline DESC
    LIMIT 1,1

    Wie kann ich also diese zwei Abfragen zusammenführen zu einer? Ist dies überhaupt möglich?
    Und wenn ja, wie?

    Als Resultat hätte ich gerne etwas, dass so ähnlich aussieht:
    +---------------+-----------------+--------------------------+
    | ticketmaskid | last_response | second_last_response |
    +---------------+-----------------+--------------------------+
    | jeweilige ID | grösster Wert | zweitgröster Wert |
    +---------------+-----------------+--------------------------+

    Vielen Dank für eure Hilfe schon im voraus
    Gruss TehQuila
     

  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
    Hach, ich mag komplexe SQLs *g*

    Etwa so könnt es gehen
    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
    
    SELECT
        ticketmaskid,
        MAX(IF(itemNum = 0, dateline, "")) AS last_response,
        MAX(IF(itemNum = 1, dateline, "")) AS second_last_response
    FROM
        (
            SELECT
                ticketid,
                dateline,
                -- Prüfen ob die Ticketmaske noch übereinstimmt - Wenn ja, itemNum um eins erhöhen, ansonsten auf 0 setzen
                @itemNum := IF(ticketmaskid = @lastMaskID, @itemNum+1, 0) AS itemNum,
                -- ticketmaskid für die nächste Zeile in die Variabel speichern
                @lastMaskID := ticketmaskid AS ticketmaskid
            FROM
                -- Variablen initialisieren
                (SELECT @lastMaskID := '', @itemNum := 0) AS vars,
                -- Sortierte Quelle
                (
                    SELECT
                        l.ticketid,
                        l.dateline,
                        t.ticketmaskid
                    FROM
                        swauditlogs AS l
                        INNER JOIN swtickets AS t
                            ON l.ticketid = t.ticketid
                    ORDER BY
                        t.ticketmaskid,
                        l.dateline DESC
                ) AS dat
        ) AS sortetDat
    WHERE
        itemNum < 2 
    GROUP BY
        ticketmaskid;
    TehQuila 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
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Wow so eine Abfrage hab ich noch nie gesehen
    Vielen Dank für die rasche Antwort!
    Hab sie gleich mal ausprobiert und sie hat auch beinahe funktioniert.

    Die Spalte mit den "ticketmaskid's" stimmt super. "last_response" und "second_last_response" sind jedoch nicht die Daten welche in der Tabelle "swauditlogs" stehen, dass sind nämlich Timestamps (hätte ich vielleicht von Anfang an erwähnen sollen).

    Das Ergebnis sieht folgendermassen aus:

    ticketmaskid
    1. AAG-349271
    2. AAO-480120
    3. AAR-636170

    last_response
    1. 31323939303534313032
    2. 31323835353637363031
    3. 31323636393239303830

    second_last_response
    1. 31323939303534313032
    2. 31323636393239303830
    3. 31323835353637363031

    Auch habe ich bei der Abfrage nicht genau gewusst wo ich meine "Einschränkungen" für die Abfrage hinpacken soll. Ich hab es an dieser Stelle probiert, da hab ich jedoch ein Syntax-Error bekommen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    (SELECT @lastMaskID := '', @itemNum := 0) AS vars, (
        SELECT
            l.ticketid,
            l.dateline,
            t.ticketmaskid
        FROM
            swauditlogs AS l
            INNER JOIN `swtickets` AS t
            ON l.ticketid = t.ticketid
        ORDER BY
            t.ticketmaskid,
            l.dateline DESC
     
    ----Meine Where-Klausel----
        WHERE
            t.ticketstatusid = 1
            t.departmentid = 1
            l.actiontype = 12
    ----Ende meiner Where-Klausel----
     
    ) AS dat

    Vielen Dank für deine Hilfe
    Gruss TehQuila
     

  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
    Die Spalte mit den "ticketmaskid's" stimmt super. "last_response" und "second_last_response" sind jedoch nicht die Daten welche in der Tabelle "swauditlogs" stehen, dass sind nämlich Timestamps (hätte ich vielleicht von Anfang an erwähnen sollen).
    Was erscheint und was sollte erscheinen? Am Besten als Beispiel

    Das WHERE
    Am besten in den innersten Select. Das hast du eigentlich richtig, jedoch muss das WHERE vor den ORDER BY sein (Normale SELECT-Syntax)
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    (
        SELECT
            l.ticketid,
            l.dateline,
            t.ticketmaskid
        FROM
            swauditlogs AS l
            INNER JOIN `swtickets` AS t
            ON l.ticketid = t.ticketid
    ----Meine Where-Klausel----
        WHERE
            t.ticketstatusid = 1
            t.departmentid = 1
            l.actiontype = 12
    ----Ende meiner Where-Klausel----
        ORDER BY
            t.ticketmaskid,
            l.dateline DESC
    ) AS dat
     
    ---------------------------------------------------------------------------------------------------
    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

  5. #5
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Zitat Zitat von Yaslaw Beitrag anzeigen
    Was erscheint und was sollte erscheinen? Am Besten als Beispiel
    Entschuldige habe es nicht ausführlich gesagt.
    Das sind die Daten welche im Moment zurückkommen:

    ticketmaskid
    1. AAG-349271
    2. AAO-480120
    3. AAR-636170

    last_response
    1. 31323939303534313032
    2. 31323835353637363031
    3. 31323636393239303830

    second_last_response
    1. 31323939303534313032
    2. 31323636393239303830
    3. 31323835353637363031

    Und diese Daten stehen effektiv in der Datenbank:

    ticketmaskid
    1. AAG-349271
    2. AAO-480120
    3. AAR-636170

    last_response
    1. 1266922501
    2. 1285567601
    3. 1299054102

    second_last_response
    1. 1266918213
    2. 1285564359
    3. 1299053904

    Habe meine Where-Klausel jetzt ans richtige Ort gepackt. (und auch mit Kommas versehen)
    Leider bekomme ich immer noch einen Syntax Error bei diesen Zeilen:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    SELECT
        l.ticketid,
        l.dateline,
        t.ticketmaskid
    FROM
        swauditlogs AS l
        INNER JOIN swtickets AS t
            ON l.ticketid = t.ticketid
    WHERE
        t.ticketstatusid = 1,
        t.departmentid = 1,
        l.actiontype = 12
    ORDER BY
        t.ticketmaskid,
        l.dateline DESC

    Vielen Dank für deine Unterstützung
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Syntax:
    Hab nicht gut hingeschaut und darum den 2ten Fehler nicht gleich gesehen.
    WHERE-Teile verbindet man nicht mit Kommas, sondern mit den Worten AND oder OR
    Code sql:
    1
    2
    3
    4
    
    WHERE
        t.ticketstatusid = 1
        AND t.departmentid = 1
        AND l.actiontype = 12

    Sind deine Daten geheim? Ansonsten kannst du mal die CREATE-Table-Scripte und die dazugehörigen INSERT-Scripte exportieren und hier reinstellen? Dann kann ich mit denselben Daten testen - macht es einfacher
     
    ---------------------------------------------------------------------------------------------------
    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

  7. #7
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Zitat Zitat von Yaslaw Beitrag anzeigen
    WHERE-Teile verbindet man nicht mit Kommas, sondern mit den Worten AND oder OR
    Stimmt. Im Nachhinein ist mir das jetzt auch aufgefallen. Diese ungewohnte Darstellungsweise der Abfrage hat mich gänzlich von meiner gewohnten SQL-Syntax abgebracht.

    Habe im Anhang die Skripts reingepackt. Habe alle persönlichen Daten entfernt und nur einige Beispieldaten von den benötigten Spalten aus den beiden Tabellen reingepackt eine Datenbank müsstest du noch erstellen wenn das in Ordnung geht. Hoffe das funktioniert so für dich.

    Danke für deine Hilfe
    Gruss TehQuila
    Angehängte Dateien Angehängte Dateien
     

  8. #8
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Also, diene Testdaten passen nicht mir deinem Beispielen von oben überein.
    Dies ist mein Resultat daraus:
    Code :
    1
    2
    3
    4
    5
    6
    
    ticketmaskid | last_response | second_last_response
    ---------------------------------------------------
    DMH-577763   | 1178487063    | 1178467063
    DYF-523660   | 1280968206    | 1280068206
    OGG-307356   | 1180178206    | 1180068206
    SCG-166410   | 1380069867    | 1380068206

    Und welches hättest d denn gerne?
     
    ---------------------------------------------------------------------------------------------------
    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

  9. #9
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Zitat Zitat von Yaslaw Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    
    ticketmaskid | last_response | second_last_response
    ---------------------------------------------------
    DMH-577763   | 1178487063    | 1178467063
    DYF-523660   | 1280968206    | 1280068206
    OGG-307356   | 1180178206    | 1180068206
    SCG-166410   | 1380069867    | 1380068206
    Genau das sollte meiner Meinung nach auch rauskommen tut es jedoch nicht...
    Meine Testdaten sind Timestamps genau wie in der Datenbank auch (einfach andere als in meinen Beispielen zuvor)

    Ich habe den Code: (nur um sicher zu gehen dass ich keine Schreibfehler im Nachhinein gemacht habe)
    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
    
    SELECT
        ticketmaskid,
        MAX(IF(itemNum = 0, dateline, "")) AS last_response,
        MAX(IF(itemNum = 1, dateline, "")) AS second_last_response
    FROM
        (
            SELECT
                ticketid,
                dateline,
                @itemNum := IF(ticketmaskid = @lastMaskID, @itemNum+1, 0) AS itemNum,
                @lastMaskID := ticketmaskid AS ticketmaskid
            FROM
                (SELECT @lastMaskID := '', @itemNum := 0) AS vars,
                (
                    SELECT
                        l.ticketid,
                        l.dateline,
                        t.ticketmaskid
                    FROM
                        swauditlogs AS l
                        INNER JOIN swtickets AS t
                            ON l.ticketid = t.ticketid
                    WHERE
                        t.ticketstatusid = 1
                        AND t.departmentid = 1
                        AND l.actiontype = 12
                    ORDER BY
                        t.ticketmaskid,
                        l.dateline DESC
                ) AS dat
        ) AS sortetDat
    WHERE
        itemNum < 2 
    GROUP BY
        ticketmaskid;

    Bei Phpmyadmin laufen lassen und da kommt jetzt (mit den funktionierenden Einschränkungen) das hier dabei raus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    ticketmaskid| last_response         | second_last_response
    ---------------------------------------------------------
    BIJ-774601  | 31333137383932343337  | 31333137383838363132
    CKB-916753  | 31333138393430363733  | 31333138393430363733
    FNY-416858  | 31333139353530393031  | 31333139353439353538
    JDU-169012  | 31333137393930333031  | 31333137393638363331
    KZS-989678  | 31333138333232313133  |  
    MBF-935585  | 31333139353430373530  | 31333139343337333531
    MGK-279728  | 31333139303331393633  |  
    MUG-995038  | 31333138393630323031  | 31333138393538373031
    RBA-571455  | 31333137393038373837  |  
    TIM-174440  | 31333138393536343237  |  
    WEW-345711  | 31333137383737393039  |  
    WYH-740816  | 31333135393033353837  | 31333131363631333230
    YBT-835218  | 31333139343439383031  | 31333139343437373334

    Sehe leider nicht was ich falsch mache... wie hast du denn diese Query ausgeführt?

    Danke für deine Unterstützung
    Gruss TehQuila
     

  10. #10
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Meines sieht genauso aus. Ich teste mit HeidiSQL lokal.

    Ich komm heute nicht mehr dazu weiterzuhelfen. Ich schau morgen nochmals nach,
     
    ---------------------------------------------------------------------------------------------------
    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

  11. #11
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Es hat sich sowieso gerade erledigt. Hab mir gedacht, dass phpmyadmin wahrscheinlich keinen Spass an der Abfrage hat, wenn bei dir das Richtige rausgekommen ist mit HeidiSQL. Also hab ich die Abfrage so wie sie ist in meine Anwendung implementiert und sie funktioniert bestens.

    Tut mir leid, dass ich dich so lange unnötigerweise aufgehalten habe.
    Vielen, vielen Dank für deine Geduld und deine kompetente Lösung.

    Gruss TehQuila
     

  12. #12
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Keine Ursache.
    Ich hoffe, du verstehst meine Lösung. Wenn da noch unklarheiten sind, frag ienfach was du nicht verstehst. Es macht Sinn zu verstehen was ein SQL_Statement wirklich macht.
     
    ---------------------------------------------------------------------------------------------------
    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

  13. #13
    Avatar von TehQuila
    TehQuila TehQuila ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    16
    Mit ein wenig Google Arbeit habe ich jetzt alles verstanden
    Danke und Gruss
    TehQuila
     
    It's not about knowing a lot. It's about being able to learn something new everyday.

Ähnliche Themen

  1. Antworten: 64
    Letzter Beitrag: 17.12.10, 20:23
  2. Antworten: 3
    Letzter Beitrag: 11.01.09, 15:27
  3. Mysql - Wert aus Spalte auslesen
    Von elena6 im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 04.01.06, 07:29
  4. MYSQL Spalte auf Wert prüfen
    Von dreambaser im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 31.05.05, 16:58
  5. mysql -> wert in spalte suchen
    Von Gaius im Forum PHP
    Antworten: 1
    Letzter Beitrag: 05.01.05, 00:10

Stichworte