ORDER BY列中类似值的数量

时间:2017-04-08 23:31:09

标签: mysql sql

我有一个清单:

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类按顺序排序,但我似乎无法得到我正在寻找的东西。当我对类进行分组时,结果集只包含每个类中的一个。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

一种有趣的方法是在order by子句中使用子查询:

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

根据具体情况,这可能比使用group by明确join更快或更慢。

解释。当组有许多元素且没有GROUP BY子句时,WHERE应该更快。

t(class)上有索引并且数据减少时(例如,通过WHERE子句),相关子查询可能会更快。考虑两个边缘情况:

  • 如果所有数据都在一个组中,则joingroup by应该更快。
  • 如果WHERE子句将输出减少到只有一行并且它是组中的唯一行,则相关子查询更快。子查询仅在一行上调用。

这些之间的确切边界各不相同。但是,MySQL更可能使用相关子查询的索引而不是GROUP BY