Ich habe eine Tabelle mit den Spalten start_date und end_date. Was wir tun müssen, ist Alles auswählen und nach Datumkonflikten für jede Object_ID gruppieren.
Ein Datumskonflikt liegt vor, wenn das Startdatum und / oder das Enddatum einer Zeile durch andere Zeilen gehen. Hier sind zum Beispiel einige Beispiele für Konflikte:
Zeile 1 hat Datum von 1. bis 5., Zeile 2 hat Datum von 2. bis 3.
Zeile 1 hat Datum 2. bis 5., Zeile 2 hat Datum 1. bis 3.
Zeile 1 hat Datum 2. bis 5., Zeile 2 hat Datum 3. bis 6.
Zeile 1 hat Datum 2. bis 5., Zeile 2 hat Datum 1. bis 7.
Wenn wir zum Beispiel einige Beispieldaten haben (nehmen wir an, dass die Zahlen zur Vereinfachung einfach Tage des Monats sind):
%Vor%Was ich erwarten würde, ist folgendes:
%Vor%Und für einen zweiten Testfall, hier einige Beispieldaten:
%Vor%Und für den zweiten Testfall, was ich als Ausgabe erwarten würde:
%Vor%Ja, ich brauche eine Möglichkeit, die erste und die zweite Gruppierung zu unterscheiden (die erste und die letzte Zeile), aber ich habe das nicht genau herausgefunden. Das Ziel besteht darin, diese Liste anzuzeigen. Wenn Sie dann auf eine Gruppe von Konflikten klicken, können Sie alle Konflikte in dieser Gruppe anzeigen.
Mein erster Gedanke war, eine GROUP BY CASE ... -Klausel zu versuchen, aber ich habe mich nur um mich selbst gewickelt.
Die Sprache, die ich benutze, um mysql aufzurufen, ist php. Wenn also jemand eine php-loop-Lösung kennt und keine große mysql-Frage, dann bin ich ganz Ohr.
Vielen Dank im Voraus.
Bearbeiten: In Primärschlüssel hinzugefügt, um etwas weniger Verwirrung zu erzeugen.
Edit: Hinzugefügt in einem Testfall 2, um weitere Argumente zu liefern.
Diese Abfrage findet die Anzahl der Duplikate:
%Vor%Sie können diese Abfrage als Grundlage für eine Abfrage verwenden, die genau das liefert, wonach Sie gefragt haben (siehe unten für die Ausgabe).
%Vor% Beachten Sie, dass ich eine Spalte id
verwendet habe, um die Zeilen zu unterscheiden. Sie können jedoch den Test von IDs, die nicht mit Vergleichen übereinstimmen, für jede Spalte ersetzen, dh od2.id != od1.id
durch Tests ersetzen, dass jede andere Spalte nicht gleich ist. Dies würde jedoch einen eindeutigen Index für alle anderen Spalten erfordern Eine ID-Spalte ist sowieso eine gute Idee.
Hier ist ein Test mit Ihren Daten:
%Vor%Ausgabe der ersten Abfrage bei Ausführung dieser Beispieldaten:
%Vor%Ausgabe der zweiten Abfrage bei Ausführung dieser Beispieldaten:
%Vor%Oracle: Dies könnte mit einer Unterabfrage in einer Gruppe durch CASE-Anweisung geschehen.
Mysql: Sie könnten eine Ansicht haben, die alle Konflikte hatte.
Wählen Sie distinct a1.appt, a2.appt vom Termin a1, Termin a2 wo a1.start & lt; a2.end und a1.end & gt; a2.start.
und dann einfach eine Zählung (*) auf dieser Tabelle.