如何使用“不在”

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

ype*_*eᵀᴹ 6

您要签入的codeNOT 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 EXISTSLEFT 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),这与您选择的查询无关(并测试它们以找出在您的情况下哪个运行速度更快)