SQL Abfrage als Schleife in php oder in einer Abfrage möglich?
Kurt
- datenbank
- sql
Aloha,
ich habe eine Frage. In einer fiktiven Tabelle ID, ID2, ID3, ID4, ID5 ... ID20 möchte ich prüfen, ob alle Einträge mit ID3=120 (ich weiß, das ist nicht endgültig normalisiert, aber es ist jetzt mal so) einen "Gegeneintrag" mit ID=150 haben und hierbei jeweils ID5, ID6, ID7 und ID8 denselben Wert haben.
Als Antwort würde mir Ja/Nein schon reichen.
Geht sowas in einer Abfrage oder selektiere ich besser alle Einträge im ersten Schritt und gehe diese dann per PHP einzeln durch und produziere im Anschluß daran "n" Abfragen (n= Menge der Einträge mit ID3=120), um auf Gleichheit in ID5 bis ID8 und ID3=150 zu prüfen?
Schönen Tag, Kurt
Aloha,
ich habe eine Frage. In einer fiktiven Tabelle ID, ID2, ID3, ID4, ID5 ... ID20 möchte ich prüfen, ob alle Einträge mit ID3=120 (ich weiß, das ist nicht endgültig normalisiert, aber es ist jetzt mal so) einen "Gegeneintrag" mit ID=150 haben und hierbei jeweils ID5, ID6, ID7 und ID8 denselben Wert haben.
Als Antwort würde mir Ja/Nein schon reichen.
Geht sowas in einer Abfrage oder selektiere ich besser alle Einträge im ersten Schritt und gehe diese dann per PHP einzeln durch und produziere im Anschluß daran "n" Abfragen (n= Menge der Einträge mit ID3=120), um auf Gleichheit in ID5 bis ID8 und ID3=150 zu prüfen?
Schönen Tag, Kurt
Uups, eine Information habe ich vergessen. Zu jedem 120er Eintrag muss nicht nur ein 150er Eintrag existieren, es muss auch ID1 + ID2 identisch sein. Das heißt, für alle Einträge mit ID=120 suche ich den Gegenpart, der ID1 + ID2 identisch hat, dazu aber ID3=150. Und als Gesamtantwort suche ich nur ein Ja/Nein, ob das für alle gefundenen 120er Einträge so ist.
Falls das zu unverständlich ist, hier ein Beispiel:
ID : ... ID1: F ID2: 55 ID3: 120 ID4: ... ID5: 55 ID6: 1 ID7: 12 ID8: 66
ID : ... ID1: F ID2: 56 ID3: 120 ID4: ... ID5: 55 ID6: 1 ID7: 12 ID8: 66
ID : ... ID1: F ID2: 55 ID3: 150 ID4: ... ID5: 55 ID6: 1 ID7: 12 ID8: 66
ID : ... ID1: F ID2: 56 ID3: 150 ID4: ... ID5: 55 ID6: 1 ID7: 120 <------- stimmt nicht. ID8: 66
ergibt "nein".
Kurt
Tach!
In einer fiktiven Tabelle [...] möchte ich prüfen, ob alle Einträge mit ID3=120 [...] einen "Gegeneintrag" mit ID=150 haben und hierbei jeweils ID5, ID6, ID7 und ID8 denselben Wert haben.
Du hast da also eine Datenmenge und du möchtest von der die Einträge haben, zu denen keine anderen Einträge existieren?
Als Antwort würde mir Ja/Nein schon reichen.
Ja. Ein Subquery mit NOT EXISTS wäre vielleicht eine Möglichkeit.
Uups, eine Information habe ich vergessen. Zu jedem 120er Eintrag muss nicht nur ein 150er Eintrag existieren, es muss auch ID1 + ID2 identisch sein.
Kann man alles in die Bedingung im Subquery reinpacken.
dedlfix.
Hi dedlfix,
Kann man alles in die Bedingung im Subquery reinpacken.
Gute Idee eigentlich. Und wie stelle ich den "Vergleich" an? Also den zwischen der äußeren und der inneren Abfrage?
select * from myTable where
ID3 = 120 AND
not exists (
select * from myTable where
ID3 = 150 AND
ID1 = ??
)
Fehlt mir da nicht ein Join?
So nach dem Motto
select * from myTable t1 where
t1.ID3 = 120 AND
not exists (
select * from myTable t2 where
t2.ID3 = 150 AND
t1.ID1 = t2.ID1
usw.
)
?
Schönen Gruß, Kurt
Tach!
Gute Idee eigentlich. Und wie stelle ich den "Vergleich" an? Also den zwischen der äußeren und der inneren Abfrage?
Das nennt sich Correlated Subquery.
Fehlt mir da nicht ein Join?
Nein. Joins machen die Sache nur komplizierter, weil sie zwei Datenmengen miteinander mischen, woran du aber eigentlich gar nicht interessiert bist.
So nach dem Motto [...] ?
Genau so. Alias verwenden, wenn es zweimal dieselbe Tabelle/Datenmenge ist, damit man unterscheiden kann, von welcher man die Felder meint.
dedlfix.
So nach dem Motto [...] ?
Genau so. Alias verwenden, wenn es zweimal dieselbe Tabelle/Datenmenge ist, damit man unterscheiden kann, von welcher man die Felder meint.
Hallo dedlfix,
ich habe es umgesetzt und es funktioniert sehr gut. Danke für deine Hilfe. Schönen Gruß, Kurt