komplizierte(?) MySql-Abfrage
Tobias
- datenbank
0 Axel Richter1 Vinzenz Mai0 Tobias
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
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 | yesSo, 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| YHat 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
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
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
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