Есть таблица posts
и comments
. Нужно (одним селектом) выбрать посты и по 3 комментария к каждому посту.
SELECT p.id,
p.userID,
p.title,
GROUP_CONCAT(c.id, c.text)
LEFT JOIN comments c FORCE INDEX(IDX_comments_postID) ON p.id = c.postID;
GROUP BY p.id;
Такой селект возвращает все что нужно, но количество комментариев должно быть <= 3 для каждого поста. Как это организовать можно?
UPDATE: Sergey Moiseenko выдал то, что нужно, готовый вариант такой:
SELECT
p.id,
p.userID,
p.title,
GROUP_CONCAT(c.id)
FROM posts p
LEFT JOIN
-- тут магия
(SELECT
IF(c.postID = @i, @n := @n + 1, @n := 1) AS a,
@i := c.postID AS postID,
c.id,
c.text
FROM (SELECT
*
FROM comments c
ORDER BY c.id DESC) c,
(SELECT
@n := 0,
@i := 0) x
ORDER BY c.postID ASC) c
ON p.id = c.postID
WHERE a <= 3
OR a IS NULL
GROUP BY p.id;
Не проверял.
SELECT p.id,
p.userID,
p.title,
GROUP_CONCAT(c.id, c.text)
posts p
LEFT JOIN
(select IF(postID=@i,@n:=@n+1,@n:=1) a, @i:=postID, c.id, c.text from
comments c, (select @n:=0,@i:=0) x
order by postID) c
ON p.id = c.postID
where a <=3 or a is null
GROUP BY p.id;
На SQL было бы примерно так:
SELECT p.id,
p.userID,
p.title,
c.id,
c.text
FROM posts p
LEFT JOIN
(
SELECT id, post_id, text
FROM
(
SELECT id, post_id, text,
row_num = ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY id) FROM comments
) top_comments
WHERE row_num <= 3
) c ON c.post_id = p.id
В MySQL, насколько я знаю, ROW_NUMBER отсутствует, но ее можно эмулировать, как описано здесь: https://preilly.me/2011/11/11/mysql-row_number/
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеются несколько таблиц с категориями и товарамиУ некоторых категорий одинаковые имена, возможно ли как-то средствами mysql слить эти две...
ЗдравствуйтеЕсть бд mysql, использую Hibernate
В коде андроид-приложения есть метод, который должен выполняться заданное времяВремя задается в переменной float
Пытаюсь передать введенную дату из элемента p:calendar в бин