考虑以下SQL表:
+------+------+
| kind | name |
+------+------+
| K1 | N1 |
| K2 | N21 |
| K2 | N22 |
| K3 | N31 |
| K3 | N32 |
| K3 | N33 |
| K4 | N4 |
+------+------+
我想显示此表格按种类和名称排序,并按照以下排序要求进行分类。 K1应始终是第一个。其余类型根据从最频繁到最不频繁类型的每种类型的名称进行排序。即结果应排序为:
+------+------+
| K1 | N1 |
| K3 | N31 |
| K3 | N32 |
| K3 | N33 |
| K2 | N21 |
| K2 | N22 |
| K4 | N4 |
+------+------+
这里K3跟随K1,因为它是最常见的类型。为了在MySQL下做到这一点,我想出了以下内容:
SELECT
a.kind, a.name
FROM
test a INNER JOIN
(SELECT kind, count(*) AS freq FROM test GROUP BY kind) b
ON a.kind = b.kind
ORDER BY
a.kind <> 'K1', b.freq desc, a.name;
这是一个好方法吗?特别是,使用嵌套选择只是为了影响排序顺序可以吗?
答案 0 :(得分:0)
在生产中使用搜索后,结果表明我提出的答案中使用的SQL不正确,因为问题也不正确。
问题是如果2种频率相同,它们的排序顺序是随机的,它们甚至可以相互交织。正确的问题应该提到,如果频率匹配,那么应该按字母顺序排序。此更正问题的答案包括Gordon Linoff的建议:
SELECT
a.kind, a.name
FROM
test a INNER JOIN
(SELECT kind, count(*) AS freq FROM test GROUP BY kind) b
ON a.kind = b.kind
ORDER BY
a.kind = 'K1' desc, b.freq desc, a.kind, a.name;