MySQL « SQL: Limit вместе с group by и order by

Есть таблица users и comments(свзязка по id, user_id). Нужно выбрать для N случайных юзеров по M комментариев.

сразу в голову приходит такой запрос, с группировкой.

select * from comments group by user_id order by rand() limit 5

Такой запрос выведет 5 всего комментов, а желаемый результат 5 комментов для каждого юзера(хотя бы без лимита для начала).

Знаю, что, LIMIT работает для всего результата, но не смог найти решения для группировки, ну или альтернативы.

1 ответов


order by rand() делать крайне не рекомендуется, на больших таблицах он будет сильно тормозить. Если вам действительно надо сделать такую выборку, лучше это сделать в два этапа:
- создайте уникальный индекс (id, user_id)
- выберите select id, user_id from comments
- программно с помощью рандома выберите нужные комментарии
- выгрузите из базы select * from comments where id in (...)


Одним запросом "красиво" это не сделать. Попробуйте так:


SELECT u5.*,
(SELECT GROUP_CONCAT(c.id SEPARATOR ',' ) FROM comments c WHERE c.id_user = u5.id order by rand() limit 0,5)
FROM
  (SELECT u.* FROM users u order by rand() limit 0,5) u5  
 
EXPLAIN у такой штуки ужасный :)