2012-07-20 41 views
6

我是MySQL的新手,我需要您的幫助。我有一個類似的數據使用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  |     
--------------------------------------------------- 

正如你可以看到有重複列RobotShortestPath值的表,但他們是非常重要的。每個數字代表一個特定的任務。如果數字連續重複(例如:1456),這意味着機器人正在執行該任務,並且數字改變時(例如1234),這意味着它已切換到另一個任務。如果先前的數字(例如:1456)再次出現,則也意味着機器人在完成早期任務(1234)之後正在執行新任務(1456)。

所以我卡住的地方是我無法得到任何執行的任務。我使用了COUNT,GROUP BY等最基本知識中的一些東西,但似乎沒有任何效果。

這裏執行的任務數量實際上是5個,但是無論我做什麼,我只得到3個結果。

+0

您是否嘗試過'SELECT COUNT(*)FROM tablename'? – dunc 2012-07-20 09:51:51

+1

你想要的結果的輸出是什麼? – 2012-07-20 09:54:31

+0

感謝您的評論。但是,這將返回表中所有條目的總數。 – 2012-07-20 09:55:39

回答

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 

更新多個表
從數據庫謝靈運normailization觀點,你用一個表更好,並有申請identifing什麼列是你所能機器人,如果沒有更多鈔票出於某種原因,獲得由工會表:

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

你好Puggan,這不會返回結果。謝謝!!! – 2012-07-20 10:01:07

+0

沒有結果?我在http://sqlfiddle.com/#!2/e80f5/3嘗試過,但我得到了4個5,嗯,但如果我運行http://sqlfiddle.com/#!2/e80f5/4 thers 5行與new_task = 1 – 2012-07-20 10:05:22

+0

你試過我的解決方案嗎? – Madhivanan 2012-07-20 10:08:26

0

我的理解,你需要的時候RobotShortestPath更改爲另一個值進行跟蹤。要做到這一點,你可以使用trigger這樣的:

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

你好帖木兒,但我怎麼能得到一個結果,即總的任務沒有? 謝謝!!! – 2012-07-20 10:01:53

+0

@BommareddyChaitanyaKrishna結果將被存儲在另一個表中。請參閱'UPDATE'語句。 – Timur 2012-07-20 10:16:44

+0

我收到以下錯誤: SQL錯誤(1235):此版本的MySQL尚不支持'多個觸發器具有相同的動作時間和一個表的事件'*/ – 2012-07-20 10:48:57

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

謝謝Madhivanan的幫助! – 2012-07-20 11:36:16

+0

你好Madhavinan,問題出在HeidiSql上,你的查詢在MySQL工作臺中返回完美的結果。非常感謝你!!! – 2012-07-20 11:52:25

0

嘗試以下查詢:

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

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

SELECT @cnt AS count; 
+0

謝謝Omesh的幫助!但這似乎並不奏效。 – 2012-07-20 11:35:57

+0

我已經在MySQL 5.5上測試過了,它的工作非常完美。檢查測試來自不同工具的相同查詢。 – Omesh 2012-07-20 11:50:16