考虑以下 SQL 表:
+------+------+
| kind | name |
+------+------+
| K1 | N1 |
| K2 | N21 |
| K2 | N22 |
| K3 | N31 |
| K3 | N32 |
| K3 | N33 |
| K4 | N4 |
+------+------+
我想显示此表,该表按种类和名称排序,并具有以下该种类的排序要求。 K1 那种应该永远是第一位的。其余种类根据每种名称的数量从最常见到最不常见的种类排序。 IE。结果应排序为:
+------+------+
| 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;
这是一个好方法吗?特别是,使用嵌套选择只是为了影响排序顺序可以吗?
最佳答案
在生产中使用搜索后,结果发现我在建议答案中使用的 SQL 不正确,因为问题也不正确。
问题是,如果两种具有相同的频率,它们的排序顺序将是随机的,甚至可能相互交织。正确的问题应该提到,如果频率匹配,则类型应按字母顺序排序。
此更正问题的答案,包括 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;
关于mysql - mysql中按频率和自定义表达式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782930/