目前我有一些关于用户操作和用户信息及其相关元信息的现有表:
Action 表:
user_id, action_detail
1 "action_click"
2 "action_drag"
用户信息表
user_id, full_name, email
1 "User One" "userone@user.com"
1 "User Two" "usertwo@user2.com"
公司信息表
company_name, company_domain
"User Company" "user.com"
"User2 Company" "user2.com"
我得到的新需求是:
构建可以找到的所有操作的查询:
- 一家公司的所有用户
- 单个公司,但不包括指定的某些用户
- 多个公司在一起,但不包括指定的某些用户
谁能对此提出一些想法(尤其是执行 2 和 3 的有效方法是什么)?
最佳答案
要求 2 是要求 3 的子集(一家公司只是规模为 1 的公司的列表)。您可以使用 exists
运算符来查找公司域下的用户,并根据其他条件排除用户:
SELECT *
FROM user u
WHERE full_name NOT IN ('John Doe', 'Jane Doe' /* or any other condition */) AND
EXISTS (SELECT *
FROM company c
WHERE c.company_name NOT IN ('company1', 'company2', /* etc. */) AND
u.email LIKE '%@' || c.company_domain)
编辑:
为了解决评论中的对话,如果您有大量被忽略的用户,您可能需要一个被忽略用户的辅助表,以便您可以为他们建立索引并加快搜索速度。
例如:
CREATE TABLE ignored_users (
full_name VARCHAR PRIMARY KEY
);
INSERT INTO ignored_users VALUES ('John Doe');
-- A bunch of other inserts...
SELECT *
FROM user u
WHERE full_name NOT IN (SELECT full_name FROM ignored_users) AND
EXISTS (SELECT *
FROM company c
WHERE c.company_name NOT IN ('company1', 'company2', /* etc. */) AND
u.email LIKE '%@' || c.company_domain)
关于sql - 如何在现有表上设计这些查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51385857/