我不是神秘学家,但我必须处理以下问题:
给出下表:
+-------+-----------+-------------+------+
| 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 );
当我知道有一些事实时,我没有得到任何结果。肯定有些事我做错了。我希望我的问题能以不仅让我知道自己想要的方式来解释:)
答案 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。即为什么你没有得到任何结果。