2015-05-05 2 views
-1

Я довольно новичок в pg и пытаюсь выяснить, какой лучший подход заключается в загрузке набора сообщений и связанных с ними комментариев вместе.Как загрузить 2 связанных набора данных вместе? (i.e сообщения и комментарии)

Например: Я пытаюсь получить 10 сообщений и комментариев, связанных со всеми этими сообщениями, например facebook wall, где вы видите фид сообщений и комментариев, загруженных на ту же страницу. Моя схема выглядит примерно так:

Posts 
-------- 
id - author - description - date - commentCount 

Comments 
------- 
id - post_id - author - description - date 

Я пытался загрузить оба сообщения и комментарии на одной и той же функции Postgres делает следующие файлы:

select * 
from posts 
LEFT join comments on posts.id = comments.post_id 

, к сожалению, она дублирует сообщения N раз, где комментарий существует, где N - количество комментариев, которые имеет сообщение. Однако первое решение является то, что я всегда могу отфильтровать его в узел после извлечения данных

Кроме того, когда я пытаюсь использовать группу по posts.id (чтобы сделать его легче пройти в узле), я получаю следующее ошибка:

column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function 

Второй, что я могу попробовать, чтобы отправить массив post_ids Я хочу, чтобы загрузить и иметь pg_function груз и отправить их обратно, но я не могу совсем право запроса:

CREATE OR REPLACE FUNCTION "getPosts"(postIds int[]) 
    RETURNS text AS 
$BODY$ 
BEGIN 
    RETURN (
     SELECT * 
     FROM Comments 
     WHERE Comments.id = postIds[0] 
    ); 
END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

назвать:

SELECT n FROM "public"."getPosts"(array[38]) As n; 

Однако, даже при попытке получить значение из одного индекса, я получаю следующее сообщение об ошибке:

ERROR: subquery must return only one column 
LINE 1: SELECT (
      ^
QUERY: SELECT (
     SELECT * 
     FROM Comments 
     WHERE Comments.id = 38 
    ) 

Наконец, последнего решения является простым макияжем N Seperate вызовы postgres, где N - количество сообщений с комментариями, поэтому, если у меня есть 5 сообщений с комментариями, я делаю 5 вызовов postgres с post_id и выбираю из таблицы комментариев.

Я действительно не уверен, что делать здесь, любая помощь будет оценена по достоинству.

Благодаря

+0

Первым решением является самым простым и быстрый. Другим потребуются два запроса и две поездки на сервер. О _duplicated_ сообщениях, которые так относятся к реляционным базам данных, и это проблема, с которой лучше справиться в уровне представления. –

+0

Вы используете только sql? –

+0

im использование postgres с узлом – Saad

ответ

0

Чтобы все комментарии как массив записей для каждого поста:

select 
    p.id, p.title, p.content, p.author, 
    array_agg(c) as comments 
from 
    posts p 
    left join 
    comments c on p.id = c.post_id 
group by 1, 2, 3, 4 

Или один массив для каждой колонки комментария:

select 
    p.id, p.title, p.content, p.author, 
    array_agg(c.author) as comment_author, 
    array_agg(c.content) as comment_content 
from 
    posts p 
    left join 
    comments c on p.id = c.post_id 
group by 1, 2, 3, 4 
Смежные вопросы