目前,我有一些关于用户动作和用户信息的现有表格以及它们相关的元信息:
动作表:
user_id, action_detail
1 "action_click"
2 "action_drag"
用户信息表
user_id, full_name, email
1 "User One" "[email protected]"
1 "User Two" "[email protected]"
公司信息表
company_name, company_domain
"User Company" "user.com"
"User2 Company" "user2.com"
我得到的新要求是:
生成可查找以下所有操作的查询:
单一公司的所有用户
单一公司,但不包括指定的某些用户
多个公司在一起,但排除指定的某些用户
有人能给我一些想法吗(特别是2和3的有效方法是什么)?
最佳答案
需求2是需求3的一个子集(一个公司只是一个公司大小的列表)。您可以使用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)