![](/img/trans.png)
[英]MySQL - Select Column 'Name' according to user's choice Where rows in Column 'id' and 'parent' equal each other
[英]MySQL - Select where all rows sharing the same id, each contain a column equal to null
尝试用这个词有点棘手,我先举一个例子
表名:标签
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语句中,将非常感谢您的帮助:)
因此,让我们分解一下:
以下查询返回您要忽略的艺术家:
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;
提示:如果您要发布数据库式的东西,可以在sqlfiddle中构建表,然后发布链接,这为人们提供了一个起点。 我做到了,链接是http://sqlfiddle.com/#!2/db53d/2
以下查询产生的结果与@AMADNON Inc.的查询结果相同。
A.分组依据和拥有
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
);
如果您有很多数据,那么让我知道每个查询的性能结果会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.