繁体   English   中英

MySQL-选择所有共享相同ID的行,每个行包含等于null的列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM