按频率和mysql中的自定义表达式排序

时间:2015-02-28 14:40:01

标签: mysql sorting

考虑以下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;

这是一个好方法吗?特别是,使用嵌套选择只是为了影响排序顺序可以吗?

1 个答案:

答案 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;