【问题标题】:How to count occurrences in SQL without creating duplicates?如何在不创建重复项的情况下计算 SQL 中的出现次数?
【发布时间】:2012-08-16 08:21:04
【问题描述】:

我有一张表,其中包含许多与不同导演 ID 相关联的电影,我需要计算由相同导演 ID 制作的电影的数量以及该导演的姓名。

我的限制是只显示制作了 5 部电影或更多电影的导演。我有 2 个单独的表,一个包含电影名称和导演 ID,另一个包含导演 ID 和导演姓名。

我在浏览本网站上其他人的答案的基础上提出了以下查询:

选择 A.Director_name, C.cnt
来自 M_Movie B
    内连接(选择 Director_ID、Director_Name
    来自 M_Director) A 上 B.Director_ID = A.Director_ID
        Inner Join (select Director_ID, count(Director_id) as cnt
        来自 M_Movie
        按 Director_ID 分组)C 上 B.Director_ID = C.Director_ID
其中cnt >= 5
按cnt desc排序;

上面的代码通过列出导演的姓名和他们导演的电影数量为我提供了所需的答案。 - 但是问题来了……

导演姓名:电影数量(CNT):
《A导演》10 《A导演》10 《A导演》10 《A主任》10...(发生10次) 《B主任》8 《B主任》8 “B主任”8....(发生8次) 《C主任》7

答案列出了“导演A”(导演了10部电影)10次,“CNT”为10,然后列表中的下一个是“导演B”(导演了8部电影)8次“CNT”为 8,然后“C 主任”被列出 7 次,以此类推……

理想情况下,我希望拥有:

导演姓名:电影数量(CNT):
《A导演》10 《B主任》8 《C主任》7 没有重复,只有列出的导演姓名和他们导演的电影数量。

请帮忙!

【问题讨论】:

    标签: sql performance tags count


    【解决方案1】:

    简单的答案是在您的查询中添加DISTINCT

    Select DISTINCT A.Director_name, C.cnt
    

    但是,您可以重写查询来避免这种情况。 有点像...

    Select A.Director_name, count(B.MovieID)
    from M_Movie B 
        Inner Join 
        M_Director A 
            on B.Director_ID = A.Director_ID
    group by a.Director_Name
    having count(b.MovieID) >=5 
    order by count(b.MovieID)  desc;
    

    【讨论】:

    • 如何加入第三张桌子?如果说我想将名为 M_DireIncred 的表中的“Director_name”更改为“Director_First_name”? (此表包含“Director_name”、“Director_First_name”、“Director_Last_name”、““Director_Age”)
    • 继续加入...INNER JOIN M_DireIncred on a.Director_Name = M_direIncred.Director_Name
    【解决方案2】:

    你可以这样做:

    SELECT Director_Name, COUNT(*) as [Count]
    FROM M_Movie m
    JOIN M_Director d on m.Director_ID = d.Director_ID
    GROUP BY Director_Name
    HAVING COUNT(*) >= 5
    

    HAVING 在分组之后运行,因此您可以使用它来过滤记录数。

    【讨论】:

      【解决方案3】:

      所以您基本上有两个选择:使用DISTINCT 关键字或使用GROUP BY Director_name 和HAVING COUNT(*)DISTINCT 关键字指定从结果集中删除重复行。 最终的结果是一样的,但是使用GROUP BY而不是DISTINCT时性能更好。

      【讨论】:

      • 如果您对 Director_name 有索引,DISTINCT 会更好。
      猜你喜欢
      • 2020-10-01
      • 1970-01-01
      • 2018-02-07
      • 2022-01-07
      • 1970-01-01
      • 2018-01-14
      • 2012-11-18
      • 2018-07-07
      • 2022-07-06
      相关资源
      最近更新 更多