MySQL WHERE 子句的子查询排除数据

Subquery for MySQL WHERE clause to exclude data

我有一个检索名称列表的查询。我需要通过添加一个子查询来修改查询,如果 t1.name 出现在 t2.exclude 中,它将排除它。我在构造子查询方面需要一些帮助,我知道这将进入下面的 WHERE 子句:

SELECT t1.name
FROM t1
WHERE *** t1.name is not in t2.exclude ***

我需要的子查询的正确语法是什么?谢谢

试试这个:

SELECT t1.name
FROM t1
WHERE t1.name NOT IN (SELECT t2.name from t2)

您将排除 t2.name

中存在的所有 t1.name

编辑 1

做一些测试,我最终得到一个非常奇怪的查询,但它有效,给你:

SELECT * from t1
WHERE t1.name NOT IN (
    SELECT t1.name FROM t1, t2
    WHERE t1.name LIKE CONCAT('%', t2.name ,'%')
)

如果您想知道它是如何工作的,它会执行 inverse whitelist 检查

  1. Select 两个表中的所有名称(这里有笛卡尔积问题)
  2. 从 t1 获取 看起来像 t2 名称(白名单)
  3. 的名称
  4. 然后使用该 t1 名称列表来过滤原始 t1 结果。 (黑名单)

tldr;你对这两个表做了一个 While-black-list。

查看 SQL Fiddle

上的测试