我有一个清单:
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
我希望结果集在最顶层有最常出现的类,但不能组合在一起。其他专栏'订单(Time
和Days
)无关紧要。它看起来像这样:
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类按顺序排序,但我似乎无法得到我正在寻找的东西。当我对类进行分组时,结果集只包含每个类中的一个。
答案 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
子句),相关子查询可能会更快。考虑两个边缘情况:
join
和group by
应该更快。WHERE
子句将输出减少到只有一行并且它是组中的唯一行,则相关子查询更快。子查询仅在一行上调用。这些之间的确切边界各不相同。但是,MySQL更可能使用相关子查询的索引而不是GROUP BY
。