【问题标题】:MySQL - Select where all rows sharing the same id, each contain a column equal to nullMySQL - 选择共享相同 ID 的所有行,每行包含等于 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 语句中,非常感谢任何帮助 :)

【问题讨论】:

    标签: mysql 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
      );
      

      如果您有大量数据,最好让我知道每个查询的性能结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多