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),这与您选择的查询无关(并测试它们以找出在您的情况下哪个运行速度更快)
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |