【问题标题】:Left Join with Count and Where Clause on right sideLeft Join with Count 和 Where 子句在右侧
【发布时间】:2017-02-08 13:23:17
【问题描述】:

我有以下疑问:

SELECT G.groupCode, G.groupName, COUNT(C.cdCode) AS numberOfTops10CDs FROM musicalgroup G 
    LEFT OUTER JOIN cd C ON C.groupCode = G.groupCode
    WHERE C.cdCode IN 
        (SELECT cdCode FROM topcds WHERE rating <= 10)
GROUP BY G.groupCode

在这种情况下,如果关联的计数为 0,它不会显示组。我希望它显示音乐组中的每个元素,即使计数为 0。 当我这样做时:

 SELECT G.groupCode, G.groupName, COUNT(C.cdCode) AS numberOfTops10CDs FROM musicalgroup G 
     LEFT OUTER JOIN cd C ON C.groupCode = G.groupCode
     GROUP BY G.groupCode

即使计数为 0,它也会显示,但我只需要显示评级低于 10 的 CD。如何在一个查询中实现这两个目标?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个:

    SELECT G.groupCode,
           G.groupName,
           COUNT(C.cdCode) AS numberOfTops10CDs 
    FROM musicalgroup G 
    LEFT OUTER JOIN cd C
        ON C.groupCode = G.groupCode AND
           C.cdCode in (SELECT distinct cdCode FROM topcds WHERE rating <= 10)
    GROUP BY G.groupCode,G.groupName
    

    【讨论】:

    • 警告:此查询在SELECT 子句中包含非聚合列,甚至不会在最新版本的 MySQL(或大多数其他 RDBMS)上运行。
    • 它的 MS - SQL 语法 (SQL_SERVER)。不是 MYSQL..也可以参考stackoverflow.com/questions/5920070/…
    • 这肯定不会在 SQL Server 上运行。您不能选择 groupName,因为它不是聚合,也不会出现在 GROUP BY 列表中。
    • 查询已编辑检查。谢谢
    【解决方案2】:

    我认为这样的事情与您正在尝试做的事情一样。下面的查询使用条件聚合来计算每个音乐组中评分大于 10 的 CD 数量。它避免了使用 WHERE 子句的问题,该子句可以删除您想要用于结果集的记录。

    SELECT g.groupCode,
           SUM(CASE WHEN c.cdCode IN
               (SELECT cdCode FROM topcds WHERE rating > 10) THEN 1 END) AS numberOfTops10CDs
    FROM musicalgroup g
    LEFT JOIN cd c
        ON g.groupCode = c.groupCode
    GROUP BY g.groupCode
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多