Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-如何检索与min/mx返回的值位于同一行中的列_Sql_Mysql_Group By - Fatal编程技术网

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;