Сложный mysql запрос. Подробности под катом

Есть таблица с 3-мя полями
id — primary key
Action — несколько предустановленных значений
user_id — ид пользователя, число

Нужно выбрать 20 записей, но так что если в подряд идущих рядках одинаковый user_id и action, то сколько бы их подряд не шло, они считаются за одну запись. То есть мы объеденяем в одну единицу контента подряд идущие рядки с одинаковыми user_id, action.

В голову только приходит выбирать по 20 штук и при необходимости мёрджить в контроллере. Но это не очень красиво :(
  • Вопрос задан
  • 5460 просмотров
Решения вопроса 1
vinxru
@vinxru
select id, action, user_id
from (select ifnull(@a<>action or @b<>user_id, 1) as w, id, @a:=action as action, @b:=user_id as user_id from table1 order by id) as t
where w


Или упрощенный вариант. Если ID это прямой первичный ключ, то сортировка не нужна, и следовательно не нужен подзапрос.

select * from table1 where (@b:=user_id)+(@a:=action)+(@w:=ifnull(@a<>action or @b<>user_id, 1))+1 and @w


На входе
Id, action, user_id
100 1 1
101 1 1
102 1 2
103 1 1
104 1 2

На выходе
id action user_id
100 1 1
102 1 2
103 1 1
104 1 2

P.S. Подзапрос можно исключить,
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
rakot
@rakot
Может недопонял, но разве не так?
SELECT `id`, `Action`, `user_id` FROM `table` GROUP BY `Action`, `user_id` LIMIT 20;
или
SELECT `id`, `Action`, `user_id` FROM (SELECT * FROM `table` LIMIT 20) GROUP BY `Action`, `user_id`;
Ответ написан
@yul
программист-фрилансер
SELECT `id`, `action`, `user_id` FROM `table` a
WHERE 
(SELECT MAX(b.`id`) FROM table b WHERE b.`id` < a.`id`) 
!= 
(SELECT MAX(c.`id`) FROM `table` c WHERE c.`action`=a.`action` AND c.`user_id` = a.`user_id` AND c.`id` < a.`id`)

Может где ошибся, или можно попроще, но идея, думаю, понятна…
Ответ написан
stanishevsky
@stanishevsky
Если у вас данные типа
Id, action, user_id
100 1 1
101 1 1
102 1 2
103 1 1
104 1 2

, то очевидно, столбец Id вам не нужен, поскольку не имеет смысла. Вам нужны только action, user_id.

Тогда это будет SELECT DISTINCT action, user_id FROM table ORDER BY user_id LIMIT 120,10; и все тут.
Ответ написан
Ваш ответ на вопрос

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

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