MySQL - select 个具有覆盖集合的值的组
MySQL - select groups having values covering a set
我有两个 table:
CREATE TABLE user (
user_id INT PRIMARY KEY,
...
);
CREATE TABLE action (
action_id INT PRIMARY KEY,
user_id INT FOREIGN KEY REFERENCES user(user_id),
action_type TINYINT,
...
);
每次用户执行特定操作时,都会在 action
table 中插入一行。
现在我想找到所有执行过某组操作的所有用户。像这样:
SELECT user_id
FROM user, action
HAVING SET(action_type) INTERSECT (0,3,4,5) = (0,3,4,5);
当然,最后一行是我编造的。在 SQL 中有这样做的好方法吗?
`having 子句中的 4
是您集合中的动作数
SELECT u.user_id
FROM user u
JOIN action a on u.user_id = a.user_id
WHERE action_type IN (0,3,4,5)
GROUP BY u.user_id
HAVING count(distinct a.action_type) = 4
另一种方式是
SELECT u.user_id
FROM user u
JOIN action a on u.user_id = a.user_id
GROUP BY u.user_id
HAVING sum(a.action_type = 0) > 0
AND sum(a.action_type = 3) > 0
AND sum(a.action_type = 4) > 0
AND sum(a.action_type = 5) > 0
这是一个集内集查询的例子。我喜欢用 group by
和 having
来解决它们,因为这是一个非常灵活的方法:
SELECT user_id
FROM action a
WHERE action_type IN (0, 3, 4, 5)
GROUP BY user_id
HAVING COUNT(DISTINCT action_type) = 4;
我有两个 table:
CREATE TABLE user (
user_id INT PRIMARY KEY,
...
);
CREATE TABLE action (
action_id INT PRIMARY KEY,
user_id INT FOREIGN KEY REFERENCES user(user_id),
action_type TINYINT,
...
);
每次用户执行特定操作时,都会在 action
table 中插入一行。
现在我想找到所有执行过某组操作的所有用户。像这样:
SELECT user_id
FROM user, action
HAVING SET(action_type) INTERSECT (0,3,4,5) = (0,3,4,5);
当然,最后一行是我编造的。在 SQL 中有这样做的好方法吗?
4
是您集合中的动作数
SELECT u.user_id
FROM user u
JOIN action a on u.user_id = a.user_id
WHERE action_type IN (0,3,4,5)
GROUP BY u.user_id
HAVING count(distinct a.action_type) = 4
另一种方式是
SELECT u.user_id
FROM user u
JOIN action a on u.user_id = a.user_id
GROUP BY u.user_id
HAVING sum(a.action_type = 0) > 0
AND sum(a.action_type = 3) > 0
AND sum(a.action_type = 4) > 0
AND sum(a.action_type = 5) > 0
这是一个集内集查询的例子。我喜欢用 group by
和 having
来解决它们,因为这是一个非常灵活的方法:
SELECT user_id
FROM action a
WHERE action_type IN (0, 3, 4, 5)
GROUP BY user_id
HAVING COUNT(DISTINCT action_type) = 4;