2012-07-20 15 views
6

Ich bin neu in MySQL und ich brauche deine Hilfe. Ich habe eine Tabelle mit ähnlichen DatenZählen Änderungen in der Zeitleiste mit MySQL

--------------------------------------------------- 
|RobotPosX|RobotPosY|RobotPosDir|RobotShortestPath| 
--------------------------------------------------- 
|0.1  | 0.2 |  15 |  1456  | 
|0.2  | 0.3 |  30 |  1456  | 
|0.54  | 0.67 |  15 |  1456  | 
|0.68  | 0.98 |  22 |  1234  | 
|0.36  | 0.65 |  45 |  1234  | 
|0.65  | 0.57 |  68 |  1456  | 
|0.65  | 0.57 |  68 |  2556  | 
|0.79  | 0.86 |  90 |  1456  |     
--------------------------------------------------- 

Wie Sie dort sehen können Werte in der Spalte RobotShortestPath wiederholt, aber sie sind wichtig. Jede Nummer repräsentiert eine bestimmte Aufgabe. Wenn sich die Nummer fortlaufend wiederholt (z. B. 1456), bedeutet dies, dass Robot diese Aufgabe ausführt, und wenn sich die Nummer ändert (Beispiel: 1234) bedeutet dies, dass sie zu einer anderen Aufgabe gewechselt hat. Und wenn die vorherige Nummer (z. B. 1456) erneut erscheint, bedeutet dies auch, dass der Roboter eine neue Aufgabe ausführt (1456), nachdem er mit der früheren Aufgabe (1234) fertig ist.

Also wo ich feststecke ist ich nicht in der Lage, keine der ausgeführten Aufgaben zu bekommen. Ich habe einige Dinge aus meinem minimalen Wissen wie COUNT, GROUP BY verwendet, aber nichts scheint zu funktionieren.

Hier ist die Anzahl der ausgeführten Aufgaben tatsächlich 5, aber was auch immer ich mache, ich bekomme nur 3 als Ergebnis.

+0

Haben Sie versucht, 'SELECT COUNT (*) FROM tablename'? – dunc

+1

Was ist die Ausgabe des gewünschten Ergebnisses? –

+0

Danke für Ihren Kommentar. Aber das würde die Gesamtzahl der Einträge in der Tabelle zurückgeben. –

Antwort

3
SET @last_task = 0; 
SELECT SUM(new_task) AS tasks_performed 
FROM (
    SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task, 
    @last_task := RobotShortestPath 
    FROM table 
    ORDER BY ?? 
) AS tmp 

Update für mehrere Tabellen
aus einer Datenbank strcture normailization Ansicht, Ihr besser mit einem Tisch und haben eine abgelegt identifing welche Spalte ist, was Roboter, wenn das nicht posible aus irgendeinem Grund, können Sie erhalten, dass die Tabellen durch Vereinigung:

SET @last_task = 0; 
SELECT robot_id, SUM(new_task) AS tasks_performed 
FROM (
    SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task, 
    @last_task := RobotShortestPath 
    FROM (
    SELECT 1 AS robot_id, robot_log_1.* FROM robot_log_1 
    UNION SELECT 2, robot_log_2.* FROM robot_log_2 
    UNION SELECT 3, robot_log_3.* FROM robot_log_3 
    UNION SELECT 4, robot_log_4.* FROM robot_log_4 
    UNION SELECT 5, robot_log_5.* FROM robot_log_5 
) as robot_log 
    ORDER BY robot_id, robot_log_id 
) AS robot_log_history 
GROUP BY robot_id 
ORDER BY tasks_performed DESC 
+0

Hallo Puggan, das gibt kein Ergebnis zurück. Danke!!! –

+0

kein Ergebnis? Ich versuchte es bei http://sqlfiddle.com/#!2/e80f5/3, aber ich bekomme 4 statt 5, hmm, aber wenn ich http://sqlfiddle.com/#!2/e80f5/4 thers 5 Zeilen mit new_task = 1 –

+0

Haben Sie meine Lösung versucht? – Madhivanan

0

Wie ich verstanden, müssen Sie, wenn verfolgen RobotShortestPath auf einen anderen Wert geändert wird. Um dies zu erreichen Sie trigger wie diese verwenden:

delimiter | 

CREATE TRIGGER track AFTER UPDATE ON yourtable 
    FOR EACH ROW BEGIN 
    IF NEW.RobotShortestPath != OLD.RobotShortestPath THEN 
     UPDATE tracktable SET counter=counter+1 WHERE tracker=1; 
    END IF; 
    END; 
| 

delimeter ; 
+0

Hallo Timur, Aber wie konnte ich ein Ergebnis erhalten, dh die Gesamtzahl der Aufgaben ??? Danke !!! –

+0

@BommareddyChaitanyaKrishna Ergebnis wird in einer anderen Tabelle gespeichert. Siehe 'UPDATE'-Anweisung. – Timur

+0

Ich bekomme den folgenden Fehler: SQL-Fehler (1235): Diese Version von MySQL unterstützt noch nicht "mehrere Trigger mit der gleichen Aktion Zeit und Ereignis für eine Tabelle" */ –

0
set @n:=0, @i:=0; 
select max(sno) from 
(
select @n:=case when @i=RobotShortestPath then @n else @n+1 end as sno, 
@i:=RobotShortestPath as dno 
from table 
) as t; 
+0

Danke Madhivanan für deine Hilfe !!! –

+0

Hallo Madhavanan, das Problem war mit HeidiSql, Ihre Abfrage liefert ein perfektes Ergebnis in MySQL Workbench. Vielen Dank!!! –

0

Versuchen folgende Abfrage:

SET @cnt = 0, @r = -1; 

SELECT IF(armed <> @r, @cnt:= @cnt + 1, 0), @r:= RobotShortestPath, @cnt FROM table; 

SELECT @cnt AS count; 
+0

Danke Omesh für Hilfe !! Aber das scheint nicht zu funktionieren. –

+0

Ich habe es auf MySQL 5.5 getestet und es funktioniert perfekt. Überprüfen Sie, ob Sie dieselbe Abfrage von einem anderen Tool aus testen. – Omesh