Mysql 要返回的SQL查询";最获提名;从年份范围,如列表(带新列)
我有一张表(提名),看起来像:Mysql 要返回的SQL查询";最获提名;从年份范围,如列表(带新列),mysql,Mysql,我有一张表(提名),看起来像: Year Category Artist-Name Title Album 1980 AlbumOfYear Michael Jackson Thriller Thriller 1980 ... ... 1981 ... ... 1982 ... ... 我正在尝试开发一个查询,该查询将从用户输入的
Year Category Artist-Name Title Album
1980 AlbumOfYear Michael Jackson Thriller Thriller
1980 ... ...
1981 ... ...
1982 ... ...
我正在尝试开发一个查询,该查询将从用户输入的年份范围中返回提名最多的艺术家姓名,然后按降序返回列表。这样的事情可能吗?(为查询中的提名和排名创建新列)
差不多
Rank Artist Nominations
1 Michael Jackson 3
2 Billy Joel 2
按以下方式使用
分组:
SET @rank=0;
SELECT @rank:=@rank+1 as rank, Artist-Name as Artist, count(*) as Nominations
WHERE Year = 1980
GROUP BY Artist-Name
ORDER BY Nominations DESC
这应该适用于oracle
select rank() over(order by nominations desc),artist,nominations from
(select artist,count(nominations) nominations from nominations where year between :loweryear and :higheryear group by artist);
对完全可行-虽然你通常不会“即时”存储可以如此轻松计算的数据(尽管你可能会查看),但问题被标记为“mysql”。这几乎是完美的,但当我查询“SET@rank=0;SELECT@rank:=@rank+1为rank,Name为Artister,count(Album)时作为1980年至1984年提名年份的提名,按艺术家分组按提名顺序描述“我按顺序获得提名,但排名并没有从1降到N。它们是随机的。第一排是1,第二排是17,第三排是66,等等。感谢使用group by时排名混乱。您需要使用一个子查询,该子查询以正确的顺序输出信息,然后排名必须应用于该结果。看看我的答案。
SET @fromyear = 1980;
SET @toyear = 1992;
SET @rank = 0;
SELECT
@rank:=@rank+1 as rank,
noms.artist,
noms.nominations
FROM
(
SELECT COUNT(*) as nominations, `Artist-Name` as artist
FROM `Nominations`
WHERE `Year` BETWEEN @fromyear AND @toyear
GROUP BY `Artist-Name`
ORDER BY COUNT(*) DESC
) as noms;