MySQL:删除连续的重复值

MySQL:删除连续的重复值,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我有一个MySQL表,它返回一个值列表,其中包含连续的重复项(按时间戳排序时) 例如,查询时,我只需要返回连续重复的值: [1, "Yellow"] [2, "Yellow"] [3, "Green"] [5, "Black"] [6, "Green"] [7, "Green"] 此处的数字用于参考-值实际上是字符串“绿色”,因此对于上述情况,新的未整理列表将为: [1, "Yellow"] [3, "Green"] [5, "Black"] [6, "Green"] 有没有一种聪明的方法来

我有一个MySQL表,它返回一个值列表,其中包含连续的重复项(按时间戳排序时)

例如,查询时,我只需要返回连续重复的值:

[1, "Yellow"]
[2, "Yellow"]
[3, "Green"]
[5, "Black"]
[6, "Green"]
[7, "Green"]
此处的数字用于参考-值实际上是字符串“绿色”,因此对于上述情况,新的未整理列表将为:

[1, "Yellow"]
[3, "Green"]
[5, "Black"]
[6, "Green"]
有没有一种聪明的方法来处理MySQL的这个问题


使用Rails/ActiveRecord,并不是说这会有什么不同,但我可以做到这一点没有问题,只是想知道是否有更聪明的方法来处理这个问题。

解决类似问题的一种方法是使用带有用户变量的子查询。可以使用用户变量跟踪上一行的颜色值,然后在外部查询的where子句中使用用户变量筛选返回的行

试着这样做:

select id,this_color as color
from
(
select id,@last as last_color,@last:=color as this_color
from your_table
order by id
) as sub
where this_color != last_color

选择不同的行非常容易。实际删除而不是您选择的不同行还有一些工作要做。delete中的语法比select中的语法要复杂得多。您必须正式声明另一个表并根据该表进行连接(它不允许您在where子句中进行相关子查询)

在子查询中选择要删除的ID,然后在delete语句中对其进行连接:

delete from test
    using test,
    (
        -- the rows i do not want
        select id
        from test
        where id not in
            -- select the rows i do want (will use the minimum id instead of being arbitrary)
            (select min(id) as id from test group by color)
    ) as temp
    where test.id = temp.id
;
以下是子查询选择的行:

id      color
2       yellow
6       green
7       green
删除后的最后一行:

id      color
1       yellow
3       green
5       black

以Ike Walker的答案为基础,这个答案可能比它需要的要复杂一些:

set @last='';
select id,@last as last_color,@last:=color as this_color
from your_table
having this_color != last_color;

使用
可以使用计算列。设置
@last
意味着它不会记住您上次运行的查询中的值,这可能会给您带来奇怪的结果。

为什么最终列表中的绿色是两次?预期结果中的最后一个
绿色是故意的还是键入错误?我想删除连续的重复项,而不仅仅是重复项。因此,7-Green是6-Green的副本,因此被删除。3-绿色保持原样。