【发布时间】:2016-04-06 00:28:19
【问题描述】:
我在 postgresql 中有两个具有多对多关联的表。第一个表包含活动,可能计数零个或多个原因:
CREATE TABLE activity (
id integer NOT NULL,
-- other fields removed for readability
);
CREATE TABLE reason (
id varchar(1) NOT NULL,
-- other fields here
);
为了执行关联,在这两个表之间存在一个连接表:
CREATE TABLE activity_reason (
activity_id integer NOT NULL, -- refers to activity.id
reason_id varchar(1) NOT NULL, -- refers to reason.id
CONSTRAINT activity_reason_activity FOREIGN KEY (activity_id) REFERENCES activity (id),
CONSTRAINT activity_reason_reason FOREIGN KEY (reason_id) REFERENCES reason (id)
);
我想计算活动和原因之间可能存在的关联。假设我在表activity_reason 中有这些记录:
+--------------+------------+
| activity_id | reason_id |
+--------------+------------+
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | B |
| 3 | A |
| 4 | C |
| 4 | D |
| 4 | E |
+--------------+------------+
我应该有类似的东西:
+-------+---+------+-------+
| count | | | |
+-------+---+------+-------+
| 2 | A | B | NULL |
| 1 | A | NULL | NULL |
| 1 | C | D | E |
+-------+---+------+-------+
或者,最终,类似:
+-------+-------+
| count | |
+-------+-------+
| 2 | A,B |
| 1 | A |
| 1 | C,D,E |
+-------+-------+
我找不到执行此操作的 SQL 查询。
【问题讨论】:
-
你在数什么?我很困惑,因为您的示例结果中包含“C,D,E”,但您的示例数据在任何地方都没有“D”。您是否尝试获取与 activity_id 相关联的所有 reason_id?
-
I remove the constraint for readability。这是一种误解。 从不移除约束,这些约束是清晰的必要条件。假设在(activity_id, reason_id)上有一个PK 的典型实现。 -
@rdubya :我修复了丢失的字母。
-
@erwin-brandstetter :我添加了约束。
标签: sql arrays postgresql many-to-many aggregate