MySQL: удалить последовательные повторяющиеся значения - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть таблица MySQL, которая возвращает список значений, который содержит последовательных дубликатов (при заказе временной меткой).

Например, при запросе мне нужно только возвращать последовательно дублированные значения:

[1, "Yellow"]
[2, "Yellow"]
[3, "Green"]
[5, "Black"]
[6, "Green"]
[7, "Green"]

Числа здесь используются для справки - значение на самом деле является строкой "Green", поэтому для вышеприведенного случая новый неиспользованный список будет:

[1, "Yellow"]
[3, "Green"]
[5, "Black"]
[6, "Green"]

Есть ли умный способ решения этой проблемы с MySQL?

Использование Rails / ActiveRecord, не то, чтобы это имело значение, но я могу сделать это без проблем, манипулируя массивом , просто задаваясь вопросом, существует ли более умный способ обработки этого.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Одним из способов решения такой проблемы является использование подзапроса с пользовательской переменной.Вы можете отслеживать значение цвета из предыдущей строки с помощью пользовательской переменной, а затем использовать пользовательскую переменную в предложении 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
2 голосов
/ 23 февраля 2011

Опираясь на ответ Айк Уокер, который, возможно, немного сложнее, чем нужно:

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

HAVING позволяет использовать вычисляемые столбцы. Установка @last означает, что он не запомнит значение из последнего выполненного вами запроса, что может привести к странным результатам.

0 голосов
/ 23 февраля 2011

Выбор отдельных строк, если довольно легко.Есть немного больше работы по фактическому удалению , а не выбранных вами отдельных строк.Синтаксис в удалении намного более привередливый, чем выбор.Вы должны формально объявить другую таблицу и присоединиться к ней (это не позволит вам создать коррелированный подзапрос в предложении where).

Выберите идентификаторы, которые вы хотите удалить в подзапросе, а затем присоединитесь к нему при удалении.оператор:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...