让许多用户属于多个群组。
CREATE TABLE users (
id bigserial PRIMARY KEY,
username varchar(50) NOT NULL
);
CREATE TABLE groups (
id bigserial PRIMARY KEY,
name varchar(50)
);
CREATE TABLE group_members (
group_id bigint NOT NULL REFERENCES groups ON DELETE CASCADE,
user_id bigint NOT NULL REFERENCES users ON DELETE CASCADE,
PRIMARY KEY (group_id, user_id)
);
获取属于群组的所有用户的集合。
SELECT DISTINCT u.id, username
FROM groups AS g
JOIN group_members AS m
ON m.group_id = g.id
JOIN users AS u
ON u.id = m.user_id
请参阅this SQL Fiddle。
使用SELECT DISTINCT ON (id)
(在上面的SELECT
查询中)而不是SELECT DISTINCT
会更快吗?
两个查询都返回相同的结果集。我宁愿使用SELECT DISTINCT
因为它更清洁。
但是,假设users
表有几列。 SELECT DISTINCT
是否足够智能,只需检查id
列(而不是所有列)是否有重复项?
答案 0 :(得分:1)
如果您从users表中选择 only ,则 不需要 (我希望用户已经不同了)
SELECT u.id, u.username
FROM users AS u
WHERE EXISTS ( SELECT *
FROM group_members AS m
WHERE u.id = m.user_id
);
并且您不需要加入groups表,因为group_members表中的FK保证它存在。