sql - 如何在现有表上设计这些查询

标签 sql database select sqlite

目前我有一些关于用户操作和用户信息及其相关元信息的现有表:

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"

我得到的新需求是:

构建可以找到的所有操作的查询:

  1. 一家公司的所有用户
  2. 单个公司,但不包括指定的某些用户
  3. 多个公司在一起,但不包括指定的某些用户

谁能对此提出一些想法(尤其是执行 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/

相关文章:

SQL - 如何使用插入的输出来更新表

c# - TransactionScope 在处置前已中止交易

sql - 使用 SQL 变量与子查询的优缺点是什么?

mysql - 如何查询 "Entity Attribute Value"表和另一个表之间的多个关系?

mysql - WHERE 中的 SQL 子查询返回有限的结果集,但仍匹配所有结果

mysql - 将多行中的列值插入到单行中

mysql - MySQL写动态查询出错

mysql - 使用连接操作在查询中显示重复行

php - TYPO3:powermail 使用错别字从自己的扩展名中选择数据

javascript - 多选html不起作用