Hallo Community,
ich stehe gerade sowas von auf dem Schlauch und hoffe dass mir hier geholfen werden kann...
Folgendes Problem:
Auf meine Stammdaten-SQL-Tabelle mache ich folgende Abfrage:
Diese Abfrage liefert mir die IDs aller User, dessen VORNAME, NACHNAME, STRASSE und WOHNORT gleich sind und die exakt zweimal in der Tabelle stehen. (Bsp.: Max Mustermann auf der Musterstraße in Musterstadt steht einmal mit ID 11 und einmal mit ID 22 in der Datenbank... => Query gibt 11 und 22 zurück).
Das funktioniert auch perfekt, ist allerdings noch nicht mein Endziel. Jetzt weiß ich zwar, dass der User doppelt in der DB steht, aber das reicht mir noch nicht!
Und zwar habe ich in der Tabelle noch ein Feld "STATUS". Um am Beispiel zu bleiben: Die ID 11 hat im Feld STATUS eine "0" stehen, die ID 22 hat einen STATUS von "1". Aktuell ist das Resultat des Query IMMER 11 und 22, ganz egal welchen Status der doppelte eingetragene User besitzt.
Nun möchte ich aber nur die ID, deren STATUS = 0 ist, in dem Falle also NUR die ID 11. Das führt mich zu folgendem Problem:
Füge ich dem Query (siehe oben) ein WHERE STATUS = 0 bzw. 1 hinzu, so bekomme ich auch nur ein Result, wenn BEIDE Datensätze STATUS 0 bzw. 1 besitzen.
Ich möchte aber, dass ich nur dann ein Result bekomme, wenn der eine STATUS = 0 und der andere STATUS = 1 ist. Ist bei beiden Datensätzen des Users der STATUS gleich (also bei beiden 0 oder bei beiden 1), dann möchte ich KEIN Result haben...
Wie muss ich jetzt die SQL-Abfrage erweitern, um das zu realisieren...?
Ich hoffe ich habe mich verständlich ausgedrückt, es ist nicht ganz einfach zu beschreiben
Ich würde mich über Lösungsvorschläge freuen, vielleicht gibt es ja noch eine alternativen Ansatz...
PS: Die einfachste Lösung wäre natürlich alle IDs in ein ARRAY zu nehmen und dieses dann durch eine foreach-Schleife zu jagen, um den Status abzufragen. Allerdings handelt es sich um ca. 20k Datensätze, die Perfomance von SQL-Abfragen in solchen Schleifen ist aber so langsam, dass dies für mich nicht in Frage kommt! Ich brauche das Result, ohne eine foreach-Schleife anzustrengen - und das geht ja dann nur über die SQL-Syntax oder irre mich da?
ich stehe gerade sowas von auf dem Schlauch und hoffe dass mir hier geholfen werden kann...
Folgendes Problem:
Auf meine Stammdaten-SQL-Tabelle mache ich folgende Abfrage:
Code:
SELECT count( * ) AS c, id FROM stammdaten GROUP BY concat( vorname, nachname, strasse, wohnort) HAVING c = 2 ORDER BY ID ASC
Das funktioniert auch perfekt, ist allerdings noch nicht mein Endziel. Jetzt weiß ich zwar, dass der User doppelt in der DB steht, aber das reicht mir noch nicht!
Und zwar habe ich in der Tabelle noch ein Feld "STATUS". Um am Beispiel zu bleiben: Die ID 11 hat im Feld STATUS eine "0" stehen, die ID 22 hat einen STATUS von "1". Aktuell ist das Resultat des Query IMMER 11 und 22, ganz egal welchen Status der doppelte eingetragene User besitzt.
Nun möchte ich aber nur die ID, deren STATUS = 0 ist, in dem Falle also NUR die ID 11. Das führt mich zu folgendem Problem:
Füge ich dem Query (siehe oben) ein WHERE STATUS = 0 bzw. 1 hinzu, so bekomme ich auch nur ein Result, wenn BEIDE Datensätze STATUS 0 bzw. 1 besitzen.
Ich möchte aber, dass ich nur dann ein Result bekomme, wenn der eine STATUS = 0 und der andere STATUS = 1 ist. Ist bei beiden Datensätzen des Users der STATUS gleich (also bei beiden 0 oder bei beiden 1), dann möchte ich KEIN Result haben...
Wie muss ich jetzt die SQL-Abfrage erweitern, um das zu realisieren...?
Ich hoffe ich habe mich verständlich ausgedrückt, es ist nicht ganz einfach zu beschreiben
Ich würde mich über Lösungsvorschläge freuen, vielleicht gibt es ja noch eine alternativen Ansatz...
PS: Die einfachste Lösung wäre natürlich alle IDs in ein ARRAY zu nehmen und dieses dann durch eine foreach-Schleife zu jagen, um den Status abzufragen. Allerdings handelt es sich um ca. 20k Datensätze, die Perfomance von SQL-Abfragen in solchen Schleifen ist aber so langsam, dass dies für mich nicht in Frage kommt! Ich brauche das Result, ohne eine foreach-Schleife anzustrengen - und das geht ja dann nur über die SQL-Syntax oder irre mich da?
Kommentar