2017-02-09 2 views
0
SELECT u.id, 
      'Shift' AS which, 
      se.created_at 
    FROM users AS u 
    JOIN schedule_elements AS se ON se.owner_id = u.id 
    UNION ALL 
      (SELECT u.id, 
         'Like' AS which, 
         ll.created_at 
      FROM users AS u 
      JOIN likes AS ll ON ll.owner_id = u.id 
      UNION 
      SELECT u.id, 
         'Comment' AS which, 
         cm.created_at 
      FROM users AS u 
      JOIN comments AS cm ON cm.owner_id = u.id) 
    ORDER BY ID DESC , created_at DESC 


The output looks like: 
id, which, created_at 
555, shift, <date> 
555, shift, <date> 
555, comment, <date> 
555, shift, <date> 
555, like, <date> 
333, shift, <date> 
333, shift, <date> 
333, comment, <date> 
333, shift, <date> 
111, like, <date> 
111, shift, <date> 
111, shift, <date> 

Выход имеет 5 записей для идентификатора 555 и 4 для 333. Я хочу отфильтровать этот запрос, чтобы у меня были только верхние 3 записи для 555, верхняя 3 для 333, и т.д ..Postgresql предельная колонка до 3 за значение

ответ

0

Используйте условие ограничения https://www.postgresql.org/docs/current/static/queries-limit.html

(SELECT u.id,'Shift' AS which,se.created_at 
    FROM users AS u 
    JOIN schedule_elements AS se ON se.owner_id = u.id ORDER BY u.id DESC , u.created_at DESC LIMIT 3) 
    UNION 
    (SELECT u.id,'Like' AS which,ll.created_at 
    FROM users AS u 
    JOIN likes AS ll ON ll.owner_id = u.id ORDER BY u.id DESC , u.created_at DESC LIMIT 3) 
    UNION 
    (SELECT u.id,'Comment' AS which,cm.created_at 
    FROM users AS u 
    JOIN comments AS cm ON cm.owner_id = u.id ORDER BY u.id DESC , u.created_at DESC LIMIT 3) 
+0

Похоже, что этот запрос не будет работать - вы можете использовать LIMIT только для всего утверждения (все 3 объединения). И даже он работает, он отображает 3 элемента на каждый SELECT не для всех. –

+0

Похоже, что здесь работает http://stackoverflow.com/questions/1415328/combining-union-and-limit-operations-in-mysql-query – pottedmeat7

+0

, что является совершенно другой задачей. Для каждой другой компании требуется 10 записей. Здесь - 3 последних операции над пользователем + их комментарии и отзывы. –

0

Возможно, вам нужно что-то вроде этого. Для p в CTE я использую ваш запрос. В p2 я устанавливаю row_number для всех строк с помощью функции windowing, после чего может отображаться только первое/последнее 3 на пользователя.

WITH p AS (
    SELECT u.id, 
      'Shift' AS which, 
      se.created_at 
    FROM users AS u 
    JOIN schedule_elements AS se ON se.owner_id = u.id 
    UNION ALL 
    SELECT u.id, 
      'Like' AS which, 
      ll.created_at 
    FROM users AS u 
    JOIN likes AS ll ON ll.owner_id = u.id 
    UNION ALL 
    SELECT u.id, 
     'Comment' AS which, 
     cm.created_at 
    FROM users AS u 
    JOIN comments AS cm ON cm.owner_id = u.id 
), p2 AS (
    SELECT *, 
     row_number() OVER (PARTITION BY id ORDER BY created_at DESC) AS rank 
    FROM p 
    WHERE which IS NOT NULL 
) 
SELECT id, which, created_at --, rank 
FROM p2 
WHERE rank <= 3 
ORDER BY ID DESC , created_at DESC; 
+0

Если мой ответ поможет вам, пожалуйста, отметьте свой вопрос как разрешенный и проголосуйте за меня. благодаря –

Смежные вопросы