2016-10-28 6 views
0

Ich brauche Hilfe oder eine Idee, wie Sie es schreiben, eine mysql-Anweisung. Ich muss eine Zeile auswählen, wenn eine bestimmte Spalte ihren Wert ändert. Zeilen danach mit demselben Wert sollten nicht ausgewählt werden. Zum Beispiel haben wir eine Tabelle wie folgt, füllen mit diesen Werten:Mysql Zeile auswählen, wenn Spaltenwert geändert

ID status_1 status_2 status_3 timestamp 
1 0  0   0  2016-01-01 00:00:00 
2 0  0   1  2016-01-01 01:00:00 
3 0  1   0  2016-01-01 02:00:00 
4 0  1   1  2016-01-01 03:00:00 
5 1  0   0  2016-01-01 04:00:00 
6 1  0   1  2016-01-01 05:00:00 
7 1  1   0  2016-01-01 06:00:00 
8 1  1   1  2016-01-01 07:00:00 

Wenn ich die Zeilen will wählen, wenn der Status_1 ändern, sollte die Abfrage die Zeilen mit ID 1 und 5 wählen, wenn ich mit status_2 arbeite Zeilen mit IDs: 1, 3, 5, 7, und wenn ich mit status_3 alle IDs arbeite. Hoffe, jemand kann mir in der Vergangenheit helfen.

Vielen Dank im Voraus

+0

Dies klingt wie ein Lücken und Inseln Problem. –

+0

Falls Ihre IDs keine Lücken haben (zB keine ID fehlt/gelöscht) und sie sich in der Reihenfolge Ihrer Bestellung befinden, handelt es sich um eine einfache Linksverknüpfung, ansonsten ist es etwas komplizierter, also sollten Sie angeben Das. – Solarflare

Antwort

3

MySQL user defined variables verwenden würde in diesem Fall helfen.

Jedes Mal, wenn Sie sehen einen neuen Status 1 als Zeilennummer der entsprechenden Zeile zuweisen.

Und wenn Sie den gleichen Status zu sehen, die Sie in der vorherigen Reihe sah dann stattdessen eine inkrementierte Zeilennummer zuweisen. Auf diese Weise

können Sie endlich die Datensätze filtern, um nur row number = 1 mit. Diese bestimmten Aufzeichnungen zeigen tatsächlich Unterschied im Vergleich zu ihrer unmittelbaren vorherigen Zeile

SELECT 
* 
FROM 
(
SELECT 
    *, 
    IF(@prevStatus = YT.status_1, @rn := @rn + 1, 
    IF(@prevStatus := YT.status_1, @rn := 1, @rn := 1) 
) AS rn 
FROM your_table YT 
CROSS JOIN 
(
    SELECT @prevStatus := -1, @rn := 1 
) AS var 
ORDER BY YT.ID 
) AS t 
WHERE t.rn = 1 
ORDER BY t.ID 
+0

Dank @ 1000111, diese Abfrage funktioniert gut. – AdrianES

0

vielleicht können Sie als Code helfen

SELECT id, IF((id NOT IN(1,3,5,6)), 1, 0) as rowStatus FROM table HAVING rowStatus = 1; 

Ich versuchte zu erklären, wie die Bedingungen hier Sie

+0

Ich bin 100% sicher, dass er nicht weiß vorher, welche Zeilen sind die, die er erhalten will, sonst könnte er nur 'schreiben, wo id in (1,3,5,6)' (oder 'nicht in') – Solarflare

+0

I habe etwas ähnliches mit if condition und recursion versucht aber @ 1000111 hat schon eine Antwort für meinen Post bekommen. Danke für den Versuch. – AdrianES

Verwandte Themen