2016-08-01 2 views
2

Я хочу выбрать комментарии к сообщению, старейшина, а затем конкретный комментарий, НО Я хочу иметь не менее 5 комментариев в любом случае.Postgres выбрать 'по крайней мере' пункты

Так что, если есть меньше 5 комментариев, это sql: SELECT * FROM comments WHERE id >= :comment_id, я должен сделать еще один выбор SELECT * FROM comments LIMIT 5.

Возможно ли получить одну и ту же логику по одному запросу?

+0

Можете ли вы как-то рассчитывать идентификатор для 'comment_id + 5 comments'? Затем вы можете изменить порядок и получить 5 последних комментариев: SELECT * FROM comments WHERE id> _comment_id + 5 comments_ ORDER BY id DESC LIMIT 5' – Adam

ответ

1
with c as (
    select count(*) as c 
    from comments 
    where id >= :comment_id 
) 
select * 
from comments 
where id >= :comment_id 
union all 
(
    select * 
    from comments 
    where id < :comment_id 
    order by id desc 
    limit greatest(5 - (select c from c), 0) 
) 
; 
+0

Извините, но не могли бы вы объяснить запрос? –

+0

@ ДенисМатафонов Это работает? –

+0

Я не могу просто ctrl + c его, я должен изменить его для проверки, но для изменения мне нужно его понять :( Я не использовал инструкцию 'with' before и не могу определить, какой' limit наибольший (5 - (выберите c из c), 0) 'является –

0

Try:

WITH x AS { 
    SELECT * FROM comments WHERE id >= :comment_id 
), 
y AS (
    SELECT * FROM comments 
    LIMIT 5 
) 
SELECT * FROM x 
WHERE 5 <= (SELECT count(*) FROM x) 
UNION ALL 
SELECT * FROM y 
WHERE 5 > (SELECT count(*) FROM x) 
Смежные вопросы