Wählen Sie alle Zeilen mit doppelten Werten in zwei Spalten von innerhalb von verschiedenen Gruppen von verwandten Datensätzen
Ich versuche, erstellen Sie eine MySQL-Abfrage, die zurückkehren wird, werden alle einzelnen Zeilen (nicht gruppiert), die doppelte Werte aus, die innerhalb einer Gruppe von bezugsdatensätzen. Von 'Gruppen von verwandten Datensätzen" meine ich, dass diejenigen, die mit dem gleichen Konto-Nummer (pro Beispiel unten).
Grundsätzlich innerhalb jeder Gruppe von verwandten Datensätzen, die denselben eindeutigen Kontonummer, wählen Sie nur die Zeilen, deren Werte für die date
oder amount
Spalten sind die gleichen wie die anderen Zeile die Werte innerhalb des Kontos Gruppe von Datensätzen. Werte sollten nur doppelte betrachtet werden, die in diesem Konto der Gruppe. Die Beispieltabelle und ideale Ausgangs details siehe unten sollten die Sache aufzuklären.
Auch, ich bin nicht besorgt, mit der alle Datensätze mit status " X zurückgegeben werden, auch wenn Sie doppelte Werte.
Kleine Beispiel-Tabelle mit den relevanten Daten:
id account invoice date amount status
1 1 1 2012-04-01 0 X
2 1 2 2012-04-01 120 P
3 1 2 2012-05-01 120 U
4 1 3 2012-05-01 117 U
5 2 4 2012-04-01 82 X
6 2 4 2012-05-01 82 U
7 2 5 2012-03-01 81 P
8 2 6 2012-05-01 80 U
9 3 7 2012-03-01 80 P
10 3 8 2012-04-01 79 U
11 3 9 2012-04-01 78 U
Ideal Ausgabe zurückgegeben von der gewünschten SQL-Abfrage:
id account invoice date amount status
2 1 2 2012-04-01 120 P
3 1 2 2012-05-01 120 U
4 1 3 2012-05-01 117 U
6 2 4 2012-05-01 82 U
8 2 6 2012-05-01 80 U
10 3 8 2012-04-01 79 U
11 3 9 2012-04-01 78 U
So, Zeile 7/9 und 8/9, sollten Sie nicht beide zurückgegeben werden, weil Ihre doppelte Werte werden nicht als Duplikate von im Rahmen der jeweiligen Konten. Jedoch, Zeile 8 sollte zurückgenommen werden, denn es teilt sich einen doppelten Wert mit Zeile 6.
Später, kann ich weiter Feilen Sie die Auswahl, indem Sie nur doppelte Zeilen, die übereinstimmende Zustände, also die Zeile 2 wäre ausgeschlossen, weil es nicht mit den anderen zwei gefunden innerhalb des Kontos Gruppe von Datensätzen. Wie viel schwieriger würde das für die Abfrage? Wäre es nur eine Frage der hinzufügen einer WHERE-oder HAVING-Klausel, oder ist es komplizierter?
Ich hoffe, meine Erklärung, was ich bin versucht zu erreichen, macht Sinn. Ich habe versucht, mit INNER JOIN, aber das gibt jeden die gewünschte Zeile mehr als einmal. Ich will keine Duplikate von Duplikaten.
Tabellenstruktur und Beispiel-Werte:
CREATE TABLE payment (
id int(11) NOT NULL auto_increment,
account int(10) NOT NULL default '0',
invoice int(10) NOT NULL default '0',
date date NOT NULL default '0000-00-00',
amount int(10) NOT NULL default '0',
status char(1) NOT NULL default '',
PRIMARY KEY (id)
);
INSERT INTO payment VALUES (1, 1, 1, '2012-04-01', 0, 'X');
INSERT INTO payment VALUES (2, 1, 2, '2012-04-01', 120, 'P');
INSERT INTO payment VALUES (3, 1, 2, '2012-05-01', 120, 'U');
INSERT INTO payment VALUES (4, 1, 3, '2012-05-01', 117, 'U');
INSERT INTO payment VALUES (5, 2, 4, '2012-04-01', 82, 'X');
INSERT INTO payment VALUES (6, 2, 4, '2012-05-01', 82, 'U');
INSERT INTO payment VALUES (7, 2, 5, '2012-03-01', 81, 'p');
INSERT INTO payment VALUES (8, 2, 6, '2012-05-01', 80, 'U');
INSERT INTO payment VALUES (9, 3, 7, '2012-03-01', 80, 'U');
INSERT INTO payment VALUES (10, 3, 8, '2012-04-01', 79, 'U');
INSERT INTO payment VALUES (11, 3, 9, '2012-04-01', 78, 'U');
Klar doch, boss. Oben Hinzugefügt! Auch Hinzugefügt die sample-Werte darunter. 🙂
Warum nicht die Reihe der
id
1 in der Ausgabe enthalten? Ihr Datum mit einem anderen Datum innerhalb Ihrer account-Gruppe.Und warum nicht 7/9 8/9? Sie sind in der diff-Konten...
Ich denke, es ist eine WHERE status != 'X'
InformationsquelleAutor purefusion | 2012-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Art der Abfrage umgesetzt werden können, wie ein semi-join.
Semijoins werden verwendet, um wählen Sie die Zeilen aus eine der Tabellen im join.
Beispiel:
Beachten Sie die Verwendung von
distinct
, und dass ich nur auswählen von Spalten aus der linken Tabelle. Dies stellt sicher, dass keine Duplikate vorhanden sind.In der join-Bedingung überprüft, dass:
l.id != r.id
)l.account = r.account
)l.date = r.date or l.amount = r.amount
)Für den zweiten Teil Ihrer Frage müssen Sie zum aktualisieren der
on
- Klausel in der Abfrage.ORDER BY id ASC
?Ja, aktualisiert. (das macht 15+ chars)
Ihre erste version arbeitete ein Genuss, wenn die BESTELLUNG DURCH war, Hinzugefügt. Nun ist diese version nicht zurück Zeilen 10/11 aus irgendeinem Grund.
sind Sie sicher? Es gibt Sie auf meinem Rechner. Habe ich einfach kopiert und eingefügt, Ihre
create table
undinserts
, und diese Abfrage.eigentlich habe ich aufgehört
TYPE=InnoDB AUTO_INCREMENT=11
weil dietype = InnoDB
verursacht einen Syntaxfehler auf meiner (5.5.11).InformationsquelleAutor Matt Fenwick
Diese scheint zu funktionieren
http://sqlfiddle.com/#!2/a50e9/3
Es produziert die Zeilen für die id 10 und 11. Überprüfen Sie die Geige, und verwenden Sie
p1.*
Yep, funktioniert auf meinem Tisch jetzt, nach der Neuerstellung der Tabelle. Muss schon ein Zufall. Naja, ich auf jeden Fall sehr zu sehen, ein anderer Ansatz. Danke! 🙂
InformationsquelleAutor goat