【问题标题】:Find the Maximum from a Count in SQL从 SQL 中的计数中查找最大值
【发布时间】:2014-12-10 22:04:20
【问题描述】:

我有一个音乐曲目数据库,我正在尝试找出哪个流派的曲目最多。 Genre 存储在 Work 表中,Track 表中的每个轨道都有一个 Work 所属的字段。

此查询正确返回流派以及它们各自拥有的曲目数量:

SELECT w.genre
     , COUNT(t.name) [numTracks] 
  FROM Track t
  LEFT 
  JOIN Work w 
    ON t.workName = w.name 
  LEFT 
  JOIN AlbumContains ta
    ON ta.workName = t.workName  
 GROUP 
    BY w.genre

但我无法找到一种方法来从该结果中获取具有最高 numTracks 的任何类型(或多个类型)。

提前致谢!

【问题讨论】:

  • mysql,标签@Strawberry中提到的sql
  • @Strawberry 这是 MS SQL Server,我不确定这个标签是如何添加的。
  • 我相信 M$SQL 使用 TOP 但不使用它,我真的不知道。

标签: sql sql-server select count group-by


【解决方案1】:

试试这个:

MySQL

SELECT w.genre, COUNT(t.name) AS numTracks
FROM work w 
LEFT JOIN Track t ON t.workName = w.name 
GROUP BY w.genre
ORDER BY COUNT(t.name) DESC 
LIMIT 1

SQL 服务器

SELECT TOP 1 w.genre, COUNT(t.name) AS numTracks
FROM work w 
LEFT JOIN Track t ON t.workName = w.name 
GROUP BY w.genre
ORDER BY COUNT(t.name) DESC 

【讨论】:

  • 这只是返回流派列表以及每个流派有多少曲目
  • 我正在尝试找出哪个流派(或流派)的曲目最多
  • 我收到“'LIMIT' 附近的语法不正确。”错误。这会返回所有曲目最多的流派,还是只返回排名靠前的流派?
【解决方案2】:
select * from (SELECT Work.genre, count(Track.name) as numTracks FROM Track LEFT JOIN Work ON Track.workName=Work.name LEFT JOIN AlbumContains ON Track.workName=AlbumContains.workName GROUP BY Work.genre)alias order by aias. numTracks desc limit 1

【讨论】:

    【解决方案3】:

    我认为你的问题不完全是,但在某种程度上类似于这个问题: SQL Select only rows with Max Value on a Column

    如果您希望所有类型的曲目最多,而不仅仅是一个(据我所知,您希望在您的问题中这样做),那么您可能需要再次加入您的查询,或者可能使用这样的子选择(MySQL):

    SELECT Work.genre, count(Track.name) as numTracks
      FROM Track
      LEFT JOIN Work ON Track.workName=Work.name
      GROUP BY Work.genre
      HAVING numTracks=
      (SELECT count(Track.name) as numTracks
        FROM Track
        LEFT JOIN Work ON Track.workName=Work.name
        GROUP BY Work.genre
        ORDER BY numTracks DESC
        LIMIT 1);
    

    或者在 MS SQL 中:

    SELECT Work.genre, count(Track.name) as numTracks
      FROM Track
      LEFT JOIN Work ON Track.workName=Work.name
      GROUP BY Work.genre
      HAVING count(Track.name) =
      (SELECT TOP(1) count(Track.name) as numTracks2
        FROM Track
        LEFT JOIN Work ON Track.workName=Work.name
        GROUP BY Work.genre
        ORDER BY numTracks2 DESC
      );
    

    这看起来很尴尬,但可能是服务器优化了子查询。但是,对于性能更好的解决方案,您可以考虑改用游标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2020-09-12
      • 1970-01-01
      • 2022-01-03
      • 2012-01-09
      • 2022-10-13
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多