场景
一张表host,包含hostID和campus两个字段,若干host归属不同的园区
目标:将host查出来,且host数量越多的园区的host记录在前。也就是按园区的host数量对查询结果进行排序
实现
如果上来就想用简单的单层sql去实现,逻辑上还是有点困惑的。count group by campus是很自然的想法,但是group by每组仅返回一条记录,并不能得到期待的host排序列表
实际上,这是按照【额外字段count】对表记录进行排序,字段count是virtual的
思路:还是分治,一步一步拆解
- 按照园区的host数量排序,首先要得到每个园区的host数量,可以通过
select count(1) as count from host group by campus
获取 - 获得每个园区的host数量之后,如果把这个count拼接到host_table,那就很容易了
| hostID | campus | count | - 怎么实现字段拼接?表join。join就是为了字段拼接而存在的
于是,我们可以通过以下sql实现目的
SELECT
host.*, counter.count
FROM
host
LEFT JOIN (
SELECT
host.campus, count(1) as count
FROM
host
GROUP BY
host.campus
) counter ON counter.campus = host.campus
ORDER BY
counter.count DESC;
总结
这个问题本质上是【基于额外字段排序】的问题
问题的通解就是,先在另一个临时表上把额外字段构造出来,然后join,从而变成普通表的排序查询
网友评论