Tobias: komplizierte(?) MySql-Abfrage

Hallo,
ich hoffe ich krieg das halbwegs verständlich erklärt was ich will. Vielleicht erstmal ne Beispieltabelle:

Datum   | Produkt | Arbeitschritt | Erfolg
------------------------------------------
01.01.09|    X    |      A        | yes
02.01.09|    X    |      B        | yes
01.01.09|    Y    |      A        | no
02.01.09|    Y    |      A        | yes
03.01.09|    Y    |      B        | yes
02.01.09|    Z    |      A        | yes

So, und nun hätte ich ganz gerne alle erfolgreichen Arbeitschritte 'A' mit Datum und Produktnamen, bei denen Arbeitsschritt 'B' bereits erfolgreich war. Die Produktnamen sind mir im Vorfeld nicht bekannt.

Die Ausgabe sollte also nach meinen Vorstellungen so aus sehen:

Datum   | Produkt
-----------------
01.01.09|    X
02.01.09|    Y

Hat jemand einen Vorschlag für mich?

Tschau

Tobias

--
Speedswimming? Finswimming? Flossenschwimmen?|http://www.tobiasklare.de |  Mein Wunschzettel
ie:{ fl:| br:> va:) ls:[ fo:| rl:( n4:° ss:| de:] ch:? mo:) zu:)
Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
  1. Hallo,

    ich hoffe ich krieg das halbwegs verständlich erklärt was ich will. Vielleicht erstmal ne Beispieltabelle:

    Datum   | Produkt | Arbeitschritt | Erfolg

    01.01.09|    X    |      A        | yes
    02.01.09|    X    |      B        | yes
    01.01.09|    Y    |      A        | no
    02.01.09|    Y    |      A        | yes
    03.01.09|    Y    |      B        | yes
    02.01.09|    Z    |      A        | yes

    So, und nun hätte ich ganz gerne alle erfolgreichen Arbeitschritte 'A' mit Datum und Produktnamen, bei denen Arbeitsschritt 'B' bereits erfolgreich war. Die Produktnamen sind mir im Vorfeld nicht bekannt.

    Die Ausgabe sollte also nach meinen Vorstellungen so aus sehen:

    Datum   | Produkt

    01.01.09|    X
    02.01.09|    Y

    Hat jemand einen Vorschlag für mich?

    Überlegung hierzu:
    ... WHERE Arbeitsschritte = "A" AND Erfolg = "yes" AND Arbeitsschritte = "B" AND Erfolg = "yes"
    würde innerhalb einer Tabelle natürlich keine Ergebnisse bringen. Man kann aber eine Tabelle mit sich selbst JOINen und dann:
    ... WHERE Tabelle1.Arbeitsschritte = "A" AND Tabelle1.Erfolg = "yes" AND Tabelle1a.Arbeitsschritte = "B" AND Tabelle1a.Erfolg = "yes"
    schreiben.

      
    SELECT Tabelle1.Datum, Tabelle1.Produkt  
    FROM Tabelle1 INNER JOIN Tabelle1 AS Tabelle1a ON Tabelle1.Produkt = Tabelle1a.Produkt  
    WHERE Tabelle1.Arbeitsschritte="A" AND Tabelle1.Erfolg="yes" AND Tabelle1a.Arbeitsschritte="B" AND Tabelle1a.Erfolg="yes";  
    
    

    viele Grüße

    Axel

  2. Hallo Tobias,

    ich hoffe ich krieg das halbwegs verständlich erklärt was ich will. Vielleicht erstmal ne Beispieltabelle:

    das ist eine hervorragende Idee. Eine schöne Problembeschreibung.

    Datum   | Produkt | Arbeitschritt | Erfolg

    01.01.09|    X    |      A        | yes
    02.01.09|    X    |      B        | yes
    01.01.09|    Y    |      A        | no
    02.01.09|    Y    |      A        | yes
    03.01.09|    Y    |      B        | yes
    02.01.09|    Z    |      A        | yes

    So, und nun hätte ich ganz gerne alle erfolgreichen Arbeitschritte 'A' mit Datum und Produktnamen, bei denen Arbeitsschritt 'B' bereits erfolgreich war. Die Produktnamen sind mir im Vorfeld nicht bekannt.

    Ich gehe davon aus, dass ein Produkt nur einmal den gleichen Arbeitsschritt mit Erfolg "yes" durchläuft. Wenn dies nicht der Fall ist, dann müsstest Du erläutern, welchen dieser Datensätze Du haben möchtest.

    Die Ausgabe sollte also nach meinen Vorstellungen so aus sehen:

    Datum   | Produkt

    01.01.09|    X
    02.01.09|    Y

    Hat jemand einen Vorschlag für mich?

    Ich hätte gleich zwei:

    1. Du sagst:
    Gib mir
        das Datum, an dem
        ein Produkt
    aus
        meiner Tabelle
    den Arbeitsschritt A
        erfolgreich durchlaufen hat
    und das in der Liste der Produkte steht, die
        den Arbeitsschritt B
        bereits erfolgreich durchlaufen haben.

    Setzen wir das in SQL um:

    SELECT                            -- Gib mir  
        Datum,                        -- das Datum, an dem  
        Produkt                       -- das Produkt  
    FROM                              -- aus  
        Tabelle                       -- meiner Tabelle  
    WHERE  
        Arbeitsschritt = 'A'          -- den Arbeitsschritt A  
    AND  
        erfolg = 'yes'                -- erfolgreich durchlaufen hat  
    AND                               -- wobei mich nur solche  
        Produkt IN (                  -- Produkte interessieren  
            SELECT                    -- die in der Liste  
                Produkt               -- der Produkte stehen  
            FROM  
                Tabelle  
            WHERE                     -- die  
                Arbeitsschritt = 'B'  -- den Arbeitsschritt B  
            AND  
                erfolg = 'yes'        -- erfolgreich durchlaufen haben.  
        )  
    
    

    Subselects unterstützt MySQL ab Version 4.1, und diese Version sollte Dir Dein Hoster auf jeden Fall zur Verfügung stellen, besser noch eine 5er-Version.

    Alternativ könntest Du Dein Problem mit einem Selfjoin lösen, wie es Axel beschrieben hat.

    Freundliche Grüße

    Vinzenz

    1. Hallo,
      klasse! Danke euch beiden!

      Ich gehe davon aus, dass ein Produkt nur einmal den gleichen Arbeitsschritt mit Erfolg "yes" durchläuft. Wenn dies nicht der Fall ist, dann müsstest Du erläutern, welchen dieser Datensätze Du haben möchtest.

      Nun ist es leider so, das es vorkommen kann (muss aber nicht) das Arbeitsschritt A nocheinmal durchlaufen werden muss, wenn Arbeitsschritt B nicht erfolgreich war. In dem Fall würde mich nur der letzte erfolgreiche Arbeitsschritt A interessieren.

      Tschau

      Tobias

      --
      Speedswimming? Finswimming? Flossenschwimmen?|http://www.tobiasklare.de |  Mein Wunschzettel
      ie:{ fl:| br:> va:) ls:[ fo:| rl:( n4:° ss:| de:] ch:? mo:) zu:)
      Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
      Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
      1. Hallo Tobias,

        Ich gehe davon aus, dass ein Produkt nur einmal den gleichen Arbeitsschritt mit Erfolg "yes" durchläuft. Wenn dies nicht der Fall ist, dann müsstest Du erläutern, welchen dieser Datensätze Du haben möchtest.

        Nun ist es leider so, das es vorkommen kann (muss aber nicht) das Arbeitsschritt A nocheinmal durchlaufen werden muss, wenn Arbeitsschritt B nicht erfolgreich war. In dem Fall würde mich nur der letzte erfolgreiche Arbeitsschritt A interessieren.

        wenn Dich *nur* das Datum und das Produkt interessieren, ist es recht einfach (wiederum mache ich eine Annahme: das Datum ist in einer Spalte mit einem angemessenen Datentyp, DATETIME oder DATE, abgespeichert):

        SELECT                            -- Gib mir  
            [link:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_max@title=MAX](Datum),                   -- das neueste Datum, an dem  
            Produkt                       -- das Produkt  
        FROM                              -- aus  
            Tabelle                       -- meiner Tabelle  
        WHERE  
            Arbeitsschritt = 'A'          -- den Arbeitsschritt A  
        AND  
            erfolg = 'yes'                -- erfolgreich durchlaufen hat  
        AND                               -- wobei mich nur solche  
            Produkt IN (                  -- Produkte interessieren  
                SELECT                    -- die in der Liste  
                    Produkt               -- der Produkte stehen  
                FROM  
                    Tabelle  
                WHERE                     -- die  
                    Arbeitsschritt = 'B'  -- den Arbeitsschritt B  
                AND  
                    erfolg = 'yes'        -- erfolgreich durchlaufen haben.  
            )  
        GROUP BY                          -- ein neuestes Datum  
            Produkt                       -- kann es nur je Produkt geben  
        
        

        Möchtest Du noch weitere Spalten zu dem Datensatz mit dem jüngsten Datum haben, dann ist das *nicht* mehr so einfach. Dann benötigst Du wahrscheinlich eine korrelierte Unterabfrage, siehe zum Beispiel diesen Archivbeitrag von mir.

        Freundliche Grüße

        Vinzenz