0

ユーザーが投稿にコメントできるコメント システムがあり、ユーザーはそれらのトップレベルのコメントに返信できます。これがネストの拡張です。ユーザーは返信に返信できません。

トップレベルのコメントと返信は同じテーブルにあります。それらはほとんど同じです。トップレベルのコメントにはpost_id、返信には が付きparent_idます。テーブルに制約を使用して、これらの列の 1 つだけが各行の値を持つようにします。

CREATE TABLE comments (
    id integer NOT NULL,
    post_id integer,
    author_id integer NOT NULL,
    body text,
    created_at timestamp without time zone,
    updated_at timestamp without time zone,
    parent_id integer,
    CONSTRAINT must_have_media_item_xor_parent CHECK ((((media_item_id IS NULL) AND (parent_id IS NOT NULL)) OR ((media_item_id IS NOT NULL) AND (parent_id IS NULL))))
);

ここで、特定の投稿に対する返信を含むすべてのコメントを数えたいと思います。クエリ

SELECT count(*)
 FROM comments
WHERE comments.post_id = 123

投稿 #123 にトップレベルのコメントがいくつあるかを教えてくれます。クエリ

SELECT count(*)
 FROM comments
 JOIN comments AS replies ON replies.parent_id = comments.id
WHERE comments.post_id = 123

返信がいくつあるか教えてくれます。両方を実行してそれらを追加することもできますが、それは重く聞こえ、できれば不要です。

2 番目のクエリからの自己結合を回避する 1 つの解決策はpost_id、値を非正規化して、応答も設定することです。次に、最初のクエリでそれらすべてをカウントします。もし私がそうするなら、私はデータベースにある種の一貫性チェックをして、それが正しいことを確認したいと思っています.

が設定されているときに Postgres の値をpost_idその親の値に制限する方法はありparent_idますか? 通常の制約は、単一の行のみを見ることができるように見えます。

または、すべてのコメントを一気にカウントする別の良い方法はありますか?

4

2 に答える 2

1

PostgreSQLがサポートしているようですCOUNT DISTINCT

次のようなことを試してみてください。

SELECT (COUNT(comments.post_id) + COUNT(DISTINCT replies.post_id)) As Total_Count 
FROM comments
LEFT JOIN comments AS replies ON replies.parent_id = comments.id
WHERE comments.post_id = 123

LEFT JOINは返信のない投稿を説明していました。

于 2013-11-11T21:33:13.037 に答える