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

标签 mysql sorting

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

相关文章:

php - 如何将数组插入MySql数据库

mysql - ActiveRecord 执行原始 sql

algorithm - 为什么我们应该使用n路合并?它比 2-way merge 有什么优势?

php - 按范围 10 x 10 对数组进行排序

mysql - 通常对一行进行排序,但对第三个 JOIN 行的其他值排序第二行

php - MySQL 查询不插入行

algorithm - 生成唯一(非重复)随机数的高效算法

c++ - 将元素传递给 std::sort 中的比较函数的顺序背后的逻辑是什么?

algorithm - 如何优化我的归并排序算法?

php - 如何在 ubuntu 12.04 中更改 mysql 数据目录