有点难以尝试说出这个,我将首先举一个例子
表名:标签
artist_id(int) | tag_id(int) | main_tag(NULL by default)
每个艺术家的行可以包含多个不同的标签,其中一个标签需要设置为主标签。
所以我试图找出所有当前没有在其中一行中设置主标签的艺术家。
示例:
artist_id | tag_id | main_tag
2203 4 NULL
2203 53 1
2203 32 NULL
我不想在这里检索艺术家ID,因为已经为这位艺术家设置了主要标签。
鉴于:
artist_id | tag_id | main_tag
1333 23 NULL
1333 44 NULL
我想得到这个artist_id,因为所有的main_tag值都是NULL。
我坚持如何将它放入SQL语句中,非常感谢任何帮助:)
答案 0 :(得分:3)
所以让我们打破这个:
您要忽略的艺术家将通过以下查询返回:
SELECT artist_id
FROM tags
WHERE main_tag IS NOT NULL
所以你想要的是那些artist_id不在上面列表中的那些:
SELECT artist_id,
tag_id
FROM tags
WHERE artist_id NOT IN (SELECT artist_id
FROM tags
WHERE main_tag IS NOT NULL);
如果您只想要artist_id,并且您希望每位艺术家只出现一次,那么您可以删除对tag_id的引用,并按艺术家进行分组:
SELECT artist_id
FROM tags
WHERE artist_id NOT IN (SELECT artist_id
FROM tags
WHERE main_tag IS NOT NULL)
GROUP BY artist_id;
提示:如果你想发布一些数据库ish,你可以在sqlfiddle中构建你的表,然后发布链接,这为人们提供了一个起点。我这样做了,链接是http://sqlfiddle.com/#!2/db53d/2
答案 1 :(得分:0)
以下查询与@AMADNON Inc.的查询结果相同。
:一种。 GROUP BY和HAVING
SELECT artist_id
FROM tags
GROUP BY artist_id
HAVING SUM(main_tag IS NULL) = COUNT(*);
<强> B中。 INNER JOIN
SELECT DISTINCT t1.artist_id
FROM tags t1 INNER JOIN (
SELECT artist_id
FROM tags WHERE main_tag IS NOT NULL
) t2 ON t1.artist_id != t2.artist_id;
<强>℃。不存在
SELECT DISTINCT artist_id
FROM tags t1
WHERE NOT EXISTS (
SELECT 1
FROM tags
WHERE main_tag IS NOT NULL
AND artist_id = t1.artist_id
);
如果您拥有大量数据,如果您让我知道每个查询的效果结果会好得多。