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
检查
- Select 两个表中的所有名称(这里有笛卡尔积问题)
- 从 t1 获取 看起来像 t2 名称(白名单)
的名称
- 然后使用该 t1 名称列表来过滤原始 t1 结果。 (黑名单)
tldr;你对这两个表做了一个 While-black-list。
查看 SQL Fiddle
上的测试
我有一个检索名称列表的查询。我需要通过添加一个子查询来修改查询,如果 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
检查
- Select 两个表中的所有名称(这里有笛卡尔积问题)
- 从 t1 获取 看起来像 t2 名称(白名单) 的名称
- 然后使用该 t1 名称列表来过滤原始 t1 结果。 (黑名单)
tldr;你对这两个表做了一个 While-black-list。
查看 SQL Fiddle
上的测试