2017-04-08 40 views
0

我有一個列表:ORDER BY類似值的數列中的

Class | Time | Days | 
AE200  800-950  MWF 
AE200 1000-1150  MWF 
CS107  800-950  MWF 
CS107 900-1050  TTH 
CS107 1100-1150  MWF 
CS107 1100-1250  TTH 
CS107 1100-1150  MWF 
ME202 1400-1550  TTH 

我想結果集的上方則最常出現的類,但不能組合在一起。其他專欄的訂單(TimeDays)無關緊要。它看起來像這樣:

Class | Time | Days | 
CS107  800-950  MWF 
CS107 900-1050  TTH 
CS107 1100-1150  MWF 
CS107 1100-1250  TTH 
CS107 1100-1150  MWF 
AE200  800-950  MWF 
AE200 1000-1150  MWF 
ME202 1400-1550  TTH 

我該怎麼辦?

我試過ORDER BY Class;和GROUP BY類ORDER BY COUNT,但我似乎無法得到我在找什麼。當我將這些類分組時,結果集只包含每個類中的一個。

+0

那麼,你到目前爲止嘗試過什麼? –

+0

我試過ORDER BY'Class';和GROUP BY'Class' ORDER BY COUNT,但我似乎無法得到我在找什麼 –

+0

因此,將其添加到您的問題(編輯它)。我們傾向於出席/回答至少表現出一些努力的人。我會給你一個答案。 –

回答

1

一種有趣的方式來做到這一點使用子查詢order by子句中:

select t.* 
from t 
order by (select count(*) from t t2 where t2.class = t.class); 

根據不同的情況,這可能是比用join做一個明確的group by更快或更慢。

解釋。 GROUP BY應該更快,當組有很多元素,並沒有WHERE條款。

當存在索引t(class)並且數據減少時(例如,通過WHERE子句),相關子查詢可能會更快。考慮兩種極端情況:

  • 如果所有的數據在一組,在該joingroup by應該會更快。
  • 如果WHERE子句將輸出減少爲只有一行,並且它是組中唯一的一行,那麼相關子查詢會更快。子查詢只在一行上調用。

它們之間的確切邊界各不相同。但是,MySQL更可能使用相關子查詢的索引而不是GROUP BY

+0

嗨戈登,你會解釋什麼是circunstantes?我很好奇,謝謝。 –

1

你要知道與當時最常見的通過計算它發生的一個,但因爲你不能組,那麼你應該有這樣的一個子查詢做到這一點:

SELECT Class, Time, Days 
    FROM yourTable a 
     INNER JOIN 
      (SELECT Class, count(*) as ord 
       FROM yourTable 
      GROUP BY Class) b 
     ON a.Class = b.Class 
    ORDER BY b.ord DESC