2016-10-28 46 views
0

我需要帮助或想法如何编写它,一个mysql语句。当特定列更改其值时,我需要选择一行。不应选择具有相同值的行。例如,我们有这样一个表,填充这个值:当列值发生变化时Mysql选择行

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 

如果我想选择行时STATUS_1变化,查询应与ID 1和5选择的行,如果我有status_2工作具有ID的行:1,3,5,7,并且如果我正在使用status_3所有ID。希望有人能够在过去的所有时间帮助我。

在此先感谢

+0

这听起来像是一个缺口和孤岛问题。 –

+0

如果您的ID不存在空位(例如,没有ID缺失/删除​​),并且它们按照您认为的顺序排列,那么这是一个简单的左连接,否则它会更复杂一些,所以您应该指定那。 – Solarflare

回答

3

MySQL user defined variables会帮助你在这种情况下。

每当您看到一个新状态,将1作为行号分配给对应的行。

如果您看到与您在前一行中看到的状态相同的状态,请改为指定递增的行号。

这样你终于可以过滤只有row number = 1的记录。这些特定的记录实际上与前一行相比显示出差异

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

谢谢@ 1000111,这个查询很好用。 – AdrianES

0

也许你可以帮助作为代码

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

我试图解释如何使用条件,这里

+0

我100%肯定他事先不知道哪些行是他想要得到的,否则他只能写'where id in(1,3,5,6)'(或'not in') – Solarflare

+0

我尝试了类似的条件和递归,但@ 1000111已经得到了我的文章的答案。感谢您的尝试。 – AdrianES

相关问题