私は3つのテーブルを持っています:
CREATE TABLE foo (
id bigint PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE foo_bar (
id bigint PRIMARY KEY,
foo_id bigint NOT NULL
);
CREATE TABLE tag (
name text NOT NULL,
target_id bigint NOT NULL,
PRIMARY KEY (name, target_id)
);
テーブルのすべてのフィールド、 wherefoo
内のアイテムの数、およびwhere内のすべてのタグのテキスト配列を取得するようなビューを作成しようとしています。私たちが持っている場合:foo_bar
foo.id = foo_bar.foo_id
foo.id = tag.target_id
INSERT INTO foo VALUES (1, 'one');
INSERT INTO foo VALUES (2, 'two');
INSERT INTO foo_bar VALUES (1, 1);
INSERT INTO foo_bar VALUES (2, 1);
INSERT INTO foo_bar VALUES (3, 2);
INSERT INTO foo_bar VALUES (4, 1);
INSERT INTO foo_bar VALUES (5, 2);
INSERT INTO tag VALUES ('a', 1);
INSERT INTO tag VALUES ('b', 1);
INSERT INTO tag VALUES ('c', 2);
結果は次のようになります。
foo.id | foo.name | count | array_agg
--------------------------------------------------
1 | one | 3 | {a, b}
2 | two | 2 | {c}
これは私がこれまでに持っているものです:
SELECT DISTINCT f.id, f.name, COUNT(b.id), array_agg(t.name)
FROM foo AS f, foo_bar AS b, tag AS t
WHERE f.id = t.target_id AND f.id = b.foo_id
GROUP BY f.id, b.id;
これらは私が得ている結果です(count
間違っていることに注意してください):
foo.id | foo.name | count | array_agg
--------------------------------------------------
1 | one | 2 | {a, b}
2 | two | 1 | {c}
個別の値count
の数ではなく、常にタグの数foo_bar
です。GROUP BY
と句を並べ替え/変更してみましたSELECT
が、探しているものではなく、異なる結果が返されます。機能に問題があると思いますが、それが問題array_agg()
なのか、どうすれば解決できるのかわかりません。