Можно ли ограничить результаты запроса JOIN? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть запрос, который в настоящее время запрашивает таблицу Post, пока ЛЕВАЯ СОЕДИНЯЕТСЯ к таблице Comment. Он выбирает все сообщения и их комментарии. Однако я хочу ограничить количество возвращаемых комментариев. Я попытался добавить суб-выбор, но столкнулся с ошибками, если я не ОГРАНИЧИЛ результаты 1. Я действительно не уверен, как это сделать, все еще используя только один запрос. Это возможно?

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Этот должен получить ваши сообщения с тремя последними комментариями на пост, при условии, что ваши таблицы выглядят так:

сообщение * 1005 * id, post_text

комментарий :
id, post_id, comment_text

SELECT id, post_text, comment_text
FROM
(
    SELECT p.id, p.post_text, c.comment_text
           CASE
             WHEN @id != p.id THEN @row_num := 1
             ELSE @row_num := @row_num + 1
           END AS rank,
           @id := p.id
    FROM post p
    LEFT JOIN comment c ON ( c.post_id = p.id )
    JOIN ( SELECT @id:=NULL, @row_num:=0 ) x
    ORDER BY p.id,
             c.id DESC -- newest comments first
) y
WHERE rank <= 3;

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

1 голос
/ 18 марта 2010

Вы не можете ограничить объединение, если у вас нет удобного значения для фильтрации (например, where pos between 1 and 5). Вы можете выбрать первый комментарий отдельно, второй комментарий, третий комментарий и т. Д. И объединить результаты. Нечто вроде:

select This, That
from Post
left join (
  select Some
  from Comment
  where PostId = Post.Id
  order by CreatedDate
  limit 1,1
) x on 1=1

union all

select This, That
from Post
inner join (
  select Some
  from Comment
  where PostId = Post.Id
  order by CreatedDate
  limit 2,1
) x on 1=1

union all

select This, That
from Post
inner join (
  select Some
  from Comment
  where PostId = Post.Id
  order by CreatedDate
  limit 3,1
) x on 1=1
...