MySQL-如何检索与min/mx返回的值位于同一行中的列
我无法正确地确定问题的标题。假设每周电影收入表如下所示:MySQL-如何检索与min/mx返回的值位于同一行中的列,sql,mysql,group-by,Sql,Mysql,Group By,我无法正确地确定问题的标题。假设每周电影收入表如下所示: MovieName <Varchar(450)> MovieGross <Decimal(18)> WeekofYear <Integer> Year <Integer> 显然,查询不会运行,而 select Max(MovieName) , Max(MovieGross) , WeekofYear from earnings where year = 2010 g
MovieName <Varchar(450)>
MovieGross <Decimal(18)>
WeekofYear <Integer>
Year <Integer>
显然,查询不会运行,而
select Max(MovieName) , Max(MovieGross) , WeekofYear
from earnings where year = 2010 group by WeekofYear;
只会给电影以最低的字母开始。使用group\u concat()
然后使用substring\u index()
是这里唯一的选项吗
select
substring_index(group_concat(MovieName order by MovieGross desc),',',1),
Max(MovieGross) , WeekofYear from earnings where year = 2010
group by WeekofYear ;
看起来很笨拙。有没有更好的方法来实现这一点?您需要确定最大每周总收入,然后根据该标准选择电影名称。大概是这样的:
SELECT e.MovieName, m.Gross, m.WeekofYear
FROM earnings e JOIN
(SELECT MAX(MovieGross) Gross, WeekofYear
FROM earnings WHERE `year` = 2010 GROUP BY WeekofYear) m
ON e.MovieGross=m.Gross AND e.WeekofYear=m.WeekofYear
这是一个不断重复出现的“每组最大值”问题。您可以通过选择组的定义属性,然后根据该属性加入“真实”数据来解决此问题
select
e.MovieName,
e.MovieGross,
e.WeekofYear
from
earnings e
inner join (
select Max(MovieGross) MovieGross, Year, WeekofYear
from earnings
group by Year, WeekofYear
) max on max.Year = e.Year
and max.WeekofYear = e.WeekofYear
and max.MovieGross = e.MovieGross
where
e.year = 2010
组的定义属性为Year
、WeekofYear
和MAX(MovieGross)
。每个组范围将有一行具有不同的值
数据表的内部联接将删除不满足组定义属性的所有行。这也意味着它可以让你通过所有的行,你可以最终得到两部电影,在任何特定的一周赚了同样的钱。再次对“外部”查询进行分组,以消除重复的行,从而支持单个电影 好的,用having子句再试一次,我无法控制自己 希望这能帮助你开始。首先,创建一个一年中几周的列表,然后对于内部查询,找到该周的最大值
Select MovieName, max(MovieGross) as max_gross, WeekofYear
from earnings
where year = 2010
order by MovieGross desc
Having MovieGross=max_gross
group by WeekofYear
这将返回每周最卖座的电影。如果出现平局,还应返回一周内的多个条目。这是一个非常快速的查询,可以完成以下任务:
SELECT e.WeekofYear as WeekofYear
, max(MovieGross) as MovieGross
, (SELECT MovieName FROM earnings
WHERE WeekofYear=e.WeekofYear ORDER BY MovieGross DESC LIMIT 1
) as MovieName
FROM earnings AS e
WHERE year='2010'
GROUP BY WeekofYear
ORDER BY WeekofYear;
很高兴帮助你:)
另外,感谢您的评分;) 对于where子句匹配250000行的表,此查询始终比group_concat/substring_索引方法(1.1秒vs 1.5秒)慢。。但它看起来很整洁谢谢你的测试。您是否有查询的解释计划和表的显示创建表?根据索引,我希望它会非常快。
SELECT e.WeekofYear as WeekofYear
, max(MovieGross) as MovieGross
, (SELECT MovieName FROM earnings
WHERE WeekofYear=e.WeekofYear ORDER BY MovieGross DESC LIMIT 1
) as MovieName
FROM earnings AS e
WHERE year='2010'
GROUP BY WeekofYear
ORDER BY WeekofYear;