Kurt: SQL Abfrage als Schleife in php oder in einer Abfrage möglich?

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

akzeptierte Antworten

  1. 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

    1. 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.

      1. 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

        1. 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.

          1. 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