NOT IN子查询给出0结果

时间:2017-11-01 12:57:50

标签: mysql subquery

我不是神秘学家,但我必须处理以下问题:

给出下表:

+-------+-----------+-------------+------+
| id    | articleID | img         | main |
+-------+-----------+-------------+------+
| 48350 |      4325 | scr426872xa |    1 |
| 48351 |      4325 | scr426872ih |    2 |
| 48352 |      4325 | scr426872jk |    2 |
| 48353 |      4326 | scr426882vs |    1 |
| 48354 |      4326 | scr426882ss |    2 |
| 48355 |      4326 | scr426882nf |    2 |
+-------+-----------+-------------+------+

一个不同的articleID的每组图像应该有一个图像设置为main = 1和一个未指定数量的图像,主要值为2

由于处理问题,可能会发生图像没有main = 1设置,我需要找到articleID,其中main = 2的图像存在,但不是main = 1。 通过向后解释它可以更容易地构建我的查询思维过程。我的想法是通过查询表格中的main为“1”的articleID来创建结果集(子查询)。然后使用该结果来检查查询的哪个不同的articleID,其中main = 2不在上述(子)查询的结果中。基本上“减去”所有匹配的articleID行。 这应该基本上给出所有main = 2行的剩余部分,这些行没有具有相同articleID的行,其中main = 1

SELECT DISTINCT articleID 
FROM img_table WHERE main = 2 
AND articleID 
NOT IN (SELECT articleID FROM img_table WHERE main = 1 );

当我知道有一些事实时,我没有得到任何结果。肯定有些事我做错了。我希望我的问题能以不仅让我知道自己想要的方式来解释:)

2 个答案:

答案 0 :(得分:0)

鉴于您的问题描述,看起来您实际上正在寻找NOT EXISTS来检查子选择中没有匹配行的行。请注意,您必须将文章ID添加到子选择中的where子句:

SELECT DISTINCT articleID 
FROM img_table t1
WHERE main = 2 
AND NOT EXISTS 
  (SELECT articleID 
   FROM img_table t2 
   WHERE main = 1 
   AND t2.articleID = t1.articleID);

我认为您当前的解决方案也应该有效,但也许您没有显示所有数据。对于您指定的数据,查询确实会返回0行,因为所有articleID都至少有一个main = 1和一个main = 2图像。

要记住的一件重要事情是:子查询不能返回任何NULL值,否则NOT IN将无法正常工作。因此,如果articleID可以为空,请确保您的子选择如下所示:

(SELECT articleID FROM img_table WHERE main = 1 and articleID IS NOT NULL)

答案 1 :(得分:0)

我在查询中没有发现任何问题,请添加一些数据,其中文章ID只有主要2.您的查询检查文章ID包含主要1,2。即为什么你没有得到任何结果。