2012-07-20 35 views
6

Tôi mới sử dụng MySQL và tôi cần sự giúp đỡ của bạn. Tôi có một bảng có dữ liệu tương tựĐếm thay đổi trong dòng thời gian với 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  |     
--------------------------------------------------- 

Như bạn có thể thấy có giá trị lặp lại trong cột RobotShortestPath, Nhưng chúng rất quan trọng. Mỗi số đại diện cho một nhiệm vụ cụ thể. Nếu số lặp lại liên tiếp (ví dụ: 1456), điều đó có nghĩa là Robot đang thực hiện tác vụ đó và khi số thay đổi (ví dụ: 1234) nghĩa là nó đã chuyển sang tác vụ khác. Và nếu số trước đó (ví dụ: 1456) xuất hiện một lần nữa nó cũng có nghĩa là robot đang thực hiện một nhiệm vụ mới (1456) sau khi thực hiện với nhiệm vụ trước đó (1234).

Vì vậy, nơi tôi bị kẹt là tôi không thể thực hiện được các tác vụ. Tôi đã sử dụng nhiều thứ từ kiến ​​thức tối thiểu của tôi như COUNT, GROUP BY nhưng không có gì có vẻ hiệu quả.

Ở đây, các tác vụ no.of được thực hiện là 5 thực tế, nhưng bất kỳ điều gì tôi cũng chỉ nhận được 3 kết quả.

+0

bạn đã thử 'SELECT COUNT (*) FROM tablename'? – dunc

+1

Đầu ra của kết quả bạn muốn là gì? –

+0

Cảm ơn bạn đã bình luận. Nhưng điều đó sẽ trả về tổng số mục nhập trong bảng. –

Trả lời

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 

Cập nhật cho nhiều bảng
Từ một cái nhìn normailization cơ sở dữ liệu strcture, tốt hơn của bạn chỉ với một bảng, và có một đệ identifing gì cột là những gì robot, nếu đó không phải posible đối với một số lý do, bạn có thể nhận được bằng cách kết hợp các bảng:

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

Xin chào Puggan, điều này sẽ không trả về kết quả nào. Cảm ơn bạn!!! –

+0

không có kết quả? tôi đã thử nó tại http://sqlfiddle.com/#!2/e80f5/3 nhưng tôi nhận được 4 insted của 5, hmm, nhưng nếu tôi chạy http://sqlfiddle.com/#!2/e80f5/4 thers 5 hàng với new_task = 1 –

+0

Bạn đã thử giải pháp của mình chưa? – Madhivanan

0

Như tôi đã hiểu, bạn cần theo dõi khi RobotShortestPath được thay đổi thành giá trị khác. Để đạt được điều này, bạn có thể sử dụng trigger như thế này:

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

Xin chào Timur, Nhưng Làm thế nào tôi có thể nhận được kết quả tức là, tổng số nhiệm vụ ??? Cảm ơn bạn !!! –

+0

@BommareddyChaitanyaKrishna kết quả sẽ được lưu trữ trong một bảng khác. Xem câu lệnh 'UPDATE'. – Timur

+0

Tôi nhận được lỗi sau: Lỗi SQL (1235): Phiên bản MySQL này chưa hỗ trợ 'nhiều trình kích hoạt có cùng thời gian và sự kiện cho một bảng' */ –

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

Cảm ơn bạn Madhivanan đã giúp đỡ của bạn !!! –

+0

Xin chào Madhavinan, vấn đề là với HeidiSql, truy vấn của bạn trả về kết quả hoàn hảo trong bàn làm việc MySQL. Cảm ơn nhiều!!! –

0

Hãy thử truy vấn sau đây:

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

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

SELECT @cnt AS count; 
+0

Cảm ơn bạn Omesh đã giúp !! Nhưng điều này dường như không hoạt động. –

+0

Tôi đã thử nghiệm nó trên MySQL 5.5 và làm việc hoàn hảo của nó. Kiểm tra kiểm tra cùng một truy vấn từ công cụ khác nhau. – Omesh

Các vấn đề liên quan