MySQL - 选择共享相同 ID 的所有行,每行包含等于 null 的列
Posted
技术标签:
【中文标题】MySQL - 选择共享相同 ID 的所有行,每行包含等于 null 的列【英文标题】:MySQL - Select where all rows sharing the same id, each contain a column equal to null 【发布时间】:2014-01-09 01:55:31 【问题描述】:这句话有点棘手,我先举个例子
表名:标签
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
我想得到这个艺术家 ID,因为所有 main_tag 值都是 NULL。
我不知道如何将它放入 SQL 语句中,非常感谢任何帮助 :)
【问题讨论】:
【参考方案1】:让我们分解一下:
您要忽略的艺术家由以下查询返回:
SELECT artist_id
FROM tags
WHERE main_tag IS NOT NULL
因此,您确实想要的是艺术家 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;
提示:如果您想发布一些类似于数据库的内容,您可以在 sqlfiddle 中构建您的表,然后发布链接,这为人们提供了一个起点。我这样做了,链接是http://sqlfiddle.com/#!2/db53d/2
【讨论】:
【参考方案2】:以下查询与@AMADNON Inc. 的查询结果相同。
A. GROUP BY 和 HAVING
SELECT artist_id
FROM tags
GROUP BY artist_id
HAVING SUM(main_tag IS NULL) = COUNT(*);
B.内连接
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;
C.不存在
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
);
如果您有大量数据,最好让我知道每个查询的性能结果。
【讨论】:
以上是关于MySQL - 选择共享相同 ID 的所有行,每行包含等于 null 的列的主要内容,如果未能解决你的问题,请参考以下文章