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

时间:2014-01-09 01:55:31

标签: mysql sql

有点难以尝试说出这个,我将首先举一个例子

表名:标签

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语句中,非常感谢任何帮助:)

2 个答案:

答案 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
);

如果您拥有大量数据,如果您让我知道每个查询的效果结果会好得多。