2010-05-13 19 views
1

我無法正確確定問題的標題。假設每週電影收益的表如下:MySQL - 如何檢索與min/mx返回的值相同的行中的列

MovieName <Varchar(450)> 
MovieGross <Decimal(18)> 
WeekofYear <Integer> 
Year  <Integer> 

那麼,如何讓頂級grossers的名稱爲今年的每一週,如果我這樣做:

select MovieName , Max(MovieGross) , WeekofYear 
from earnings where year = 2010 group by WeekofYear; 

那麼顯然查詢不會運行,而

select Max(MovieName) , Max(MovieGross) , WeekofYear 
from earnings where year = 2010 group by WeekofYear; 

只會給電影開始與最低字母表。是使用group_concat(),然後substring_index()這裏唯一的選擇?

select 
     substring_index(group_concat(MovieName order by MovieGross desc),',',1), 
     Max(MovieGross) , WeekofYear from earnings where year = 2010 
    group by WeekofYear ; 

似乎笨拙。有沒有更好的方法來實現這一目標?

回答

0

您需要確定最大每週總量,然後根據該標準選擇電影名稱。像這樣的:

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 
2

這是不斷髮生的最大每組問題。你可以通過選擇你的組的定義屬性,然後加入你的「真實」數據來解決它。

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 

你的團隊的定義屬性是YearWeekofYearMAX(MovieGross)。每個組範圍將有一行具有不同的值。

對數據表的INNER JOIN會取消所有不滿足組的定義屬性的行。這也意味着它可以讓所有的行都做到 - 你可能會得到兩部電影,在任何一個特定的星期內賺取相同的金額。再次對「外部」查詢進行分組以消除重複的行以支持單個電影。

0

好吧,再次嘗試使用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 

這應該會返回每週最暢銷的電影。如果平局發生,這也應該在一週內返回多個條目。

雅各

+0

這個查詢是一貫慢於group_concat/substring_index方法(1.1秒與1.5秒)的表約250,000行匹配的where子句......但它確實看起來更整潔 – Gala101 2010-05-19 11:47:40

+0

感謝您對它進行測試。你碰巧有查詢的解釋計劃和表格創建表嗎?根據指標,我預計它會非常快。 – TheJacobTaylor 2010-05-23 03:51:16

0

這是相當快的查詢,即這項工作:

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; 

竭誠爲您服務:)

附:並感謝收視率;)

相關問題