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 работает для всего результата, но не смог найти решения для группировки, ну или альтернативы.
сразу в голову приходит такой запрос, с группировкой.
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 у такой штуки ужасный :)