Наполовину уникальная группировка в MySQL

Всем добрый день!

Ситуация следующая. Имею таблицу с данными:
4101167.png

Хочу сделать следующее:
1. Сделать выборку по данных по заданному `elem_id`
2. Сгруппировать их по полю `state` следующим образом:
- например, у первой записи `state` = 5
- все записи со `state`=5, идущие после этой и до записи с другой `state` (равной 6, например) - отбрасываются
- и так для всех `state`: если после `state`=6 будут идти записи со `state`=5 - для них будет уже другая группировка, отдельная от предыдущей

В результате, для полей с `elem_id`=1 получается такая таблица:
4063279.png

Для полей с `elem_id`=2 таблица следующая:
4068399.png

Буду благодарен советам, в какую сторону копать, с какого бока заходить и что почитать.

Дамп исходной таблицы и структуру прикладываю:
--
-- Структура таблицы `test`
--

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `elem_id` int(11) NOT NULL,
  `state` int(11) NOT NULL,
  `time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Дамп данных таблицы `test`
--

INSERT INTO `test` (`id`, `elem_id`, `state`, `time`) VALUES
(1, 1, 5, '2013-12-20 00:01:00'),
(2, 1, 5, '2013-12-20 00:02:00'),
(3, 2, 1, '2013-12-20 00:03:00'),
(4, 1, 5, '2013-12-20 00:04:00'),
(5, 1, 6, '2013-12-20 00:05:00'),
(6, 2, 1, '2013-12-20 00:06:00'),
(7, 2, 2, '2013-12-20 00:07:00'),
(8, 1, 5, '2013-12-20 00:08:00'),
(9, 1, 5, '2013-12-20 00:09:00'),
(10, 2, 1, '2013-12-20 00:10:00');
  • Вопрос задан
  • 2692 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SET @laststate = 0; 
SELECT *, @lastState := state FROM 
    (SELECT * FROM test WHERE elem_id = 1 ORDER BY time) AS temp 
    WHERE state != @lastState
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы