【发布时间】:2013-02-22 01:19:12
【问题描述】:
我有三张桌子:
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)
);
我正在尝试创建一个视图,以便获取表 foo 的所有字段、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() 函数时遇到了问题,但我不确定是否是这种情况或如何解决它。
【问题讨论】:
标签: sql postgresql left-join aggregate-functions cross-join