2015-08-07 4 views
2

У меня есть сообщения, звуки, уведомления. Я хочуPostgres JSON Join, Union

  1. сообщений сортировки по баллам
  2. удалить прокатывается те
  3. присоединиться уведомления с сообщениями и положить присоединившихся них, как высшие оценки

До сих пор я сделал первые два, но не мог Не добавляйте уведомления в качестве первых элементов результата. Это рабочий запрос первых двух.

SELECT posts.id, posts.created_at, posts.data, ((posts.data)->>'score')::NUMERIC as score 
FROM posts 
WHERE NOT EXISTS (
    SELECT * 
    FROM swipes 
    WHERE ((swipes.data)->>'post_id')::INT = posts.id AND ((swipes.data)->>'user_id')::INT = 32) 
ORDER BY (data)->>'score' 
LIMIT 5 

Я попытался LEFT JOIN для добавления уведомления, но не может это сделать.

SELECT posts.id, posts.created_at, posts.data, ((posts.data)->>'score')::NUMERIC as score 
FROM posts 
WHERE NOT EXISTS (
    SELECT * 
    FROM swipes 
    WHERE ((swipes.data)->>'post_id')::INT = posts.id AND ((swipes.data)->>'user_id')::INT = 32) 

-- The part below is new 
UNION ALL 
SELECT notifications.id, notifications.created_at, notifications.data, 9999999 AS score 
FROM notifications 

--- THIS GIVES ERROR --- 
LEFT JOIN posts USING (notifications.data)->>'post_id') 

WHERE ((notifications.data)->>'user_id')::INT = 32 

-- After join order by score 
ORDER BY score 
LIMIT 5 

уведомления имеет столбец с именем data типа json. notifications.data->post_id должен соединить posts.id с ним по баллам 9999999. где notifications.data->user_id должен быть равен 32.

+0

вы хотите уведомления как дополнительные столбцы к сообщениям или как дополнительные строки? – Patrick

+0

@Patrick как дополнительные строки – Thellimist

ответ

1

Если вы хотите, чтобы строки из таблицы «уведомлений» в дополнение к строкам из «сообщений» таблицы, то вы должны UNION:

SELECT id, created_at, data, (data->>'score')::numeric AS score 
FROM posts 
WHERE NOT EXISTS (
    SELECT 1 
    FROM swipes 
    WHERE ((swipes.data)->>'post_id')::int = posts.id 
     AND ((swipes.data)->>'user_id')::int = 32) 

UNION ALL 

SELECT id, created_at, data, 9999999 AS score 
FROM notifications 

             
  
    LEFT JOIN posts USING (notifications.data)->>'post_id') 
   
WHERE (data->>'user_id')::int = 32 

-- After join order by score 
ORDER BY score 
LIMIT 5;

Если вместо этого вы хотите добавить столбцы таблицы «уведомлений» для тех сообщений таблицы», то вы должны JOIN:

SELECT p.id, p.created_at, p.data, (p.data->>'score')::numeric AS score 
     n.id, n.created_at, n.data 
FROM posts p 
JOIN notifications n ON n->>'post_id' = p->>'post_id' -- guessing here 
WHERE NOT EXISTS (
    SELECT 1 
    FROM swipes 
    WHERE ((swipes.data)->>'post_id')::int = p.id 
     AND ((swipes.data)->>'user_id')::int = 32) 
WHERE (n.data->>'user_id')::int = 32 
ORDER BY score 
LIMIT 5;