0 mysql
我想找到promo_id = 1
其中不存在的所有代码promo_id = 2
表名: promo_codes
列: id、promo_id、代码
SELECT code FROM promo_codes where promo_id=1 NOT IN
(SELECT code FROM promo_codes where promo_id=2);
Run Code Online (Sandbox Code Playgroud)
我总是得到 0 行返回,即使其中promo_id = 1
不存在代码promo_id = 2
您要签入的code
是NOT IN
该代码列表。您的语法需要更正。具体来说,使用AND code NOT IN (...)
:
SELECT code
FROM promo_codes
WHERE promo_id = 1
AND code NOT IN
(SELECT code FROM promo_codes WHERE promo_id = 2) ;
Run Code Online (Sandbox Code Playgroud)
如果code
可为空,则应在子查询中再添加一项检查,以避免出现以下NULL
问题NOT IN
:
SELECT code
FROM promo_codes
WHERE promo_id = 1
AND code NOT IN
(SELECT code
FROM promo_codes
WHERE promo_id = 2
AND code IS NOT NULL) ;
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用NOT EXISTS
或LEFT JOIN
/IS NULL
检查。它们通常比 更有效NOT IN (subquery)
,尤其是在较旧的 MySQL 版本中:
-- using NOT EXISTS
SELECT p1.code
FROM promo_codes AS p1
WHERE p1.promo_id = 1
AND NOT EXISTS
(SELECT 1
FROM promo_codes AS p2
WHERE p2.promo_id = 2
AND p2.code = p1.code) ;
-- using LEFT JOIN / IS NULL
SELECT p1.code
FROM promo_codes AS p1
LEFT JOIN promo_codes AS p2
ON p2.promo_id = 2
AND p2.code = p1.code
WHERE p1.promo_id = 1
AND p2.promo_id IS NULL ;
Run Code Online (Sandbox Code Playgroud)
为了提高效率,我建议您在 上添加一个复合索引(promo_id, code)
,这与您选择的查询无关(并测试它们以找出在您的情况下哪个运行速度更快)