Как ограничить количество данных в LEFT JOIN?

346
25 октября 2017, 04:03

Есть таблица 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;
Answer 1

Не проверял.

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;
Answer 2

На 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/

READ ALSO
Одинаковые таблицы в бд

Одинаковые таблицы в бд

Имеются несколько таблиц с категориями и товарамиУ некоторых категорий одинаковые имена, возможно ли как-то средствами mysql слить эти две...

185
Выполнять метод пока не истекло время. java [требует правки]

Выполнять метод пока не истекло время. java [требует правки]

В коде андроид-приложения есть метод, который должен выполняться заданное времяВремя задается в переменной float

239
Не передается дата из элемента p:calendar

Не передается дата из элемента p:calendar

Пытаюсь передать введенную дату из элемента p:calendar в бин

190