Php 按频率排序SQL查询记录

Php 按频率排序SQL查询记录,php,mysql,sql,Php,Mysql,Sql,有没有办法按照某个值在列中出现的频率对从SQL查询中选择的记录进行排序?例如:如果有五条记录的列为'value1',三条记录的列为'value2',两条记录的列为'value3',是否有办法使结果首先显示'value1',然后显示'value2',最后显示'value3' SELECT `column`, COUNT(`column`) AS `count` FROM `table` GROUP BY `column` ORDER BY `count` DESC

有没有办法按照某个值在列中出现的频率对从SQL查询中选择的记录进行排序?例如:如果有五条记录的列为'value1',三条记录的列为'value2',两条记录的列为'value3',是否有办法使结果首先显示'value1',然后显示'value2',最后显示'value3'

SELECT   `column`,
         COUNT(`column`) AS `count`
FROM     `table`
GROUP BY `column`
ORDER BY `count` DESC
快速PoC:

mysql> CREATE TABLE `table` (`id` SERIAL, `column` char(6) NOT NULL, KEY `column_idx`(`column`)); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `table` (`column`) VALUES ('value1'), ('value1'), ('value1'), ('value1'), ('value1'), ('value2'), ('value2'), ('value2'), ('value3'), ('value3'); Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM `table`; +----+--------+ | id | column | +----+--------+ | 1 | value1 | | 2 | value1 | | 3 | value1 | | 4 | value1 | | 5 | value1 | | 6 | value2 | | 7 | value2 | | 8 | value2 | | 9 | value3 | | 10 | value3 | +----+--------+ 10 rows in set (0.00 sec) mysql> SELECT `column`, -> COUNT(`column`) AS `count` -> FROM `table` -> GROUP BY `column` -> ORDER BY `count` DESC; +--------+-------+ | column | count | +--------+-------+ | value1 | 5 | | value2 | 3 | | value3 | 2 | +--------+-------+ 3 rows in set (0.00 sec) mysql>创建表`TABLE`(`id`SERIAL,`column`char(6)不为空,键`column_idx`(`column`)); 查询正常,0行受影响(0.01秒) mysql>将值('value1')、('value1')、('value1')、('value1')、('value1')、('value2')、('value2')、('value2')、('value3')、('value3')插入“表”('column'); 查询正常,受影响的10行(0.00秒) 记录:10个重复:0警告:0 mysql>从“表”中选择*; +----+--------+ |id |列| +----+--------+ |1 |值1| |2 |值1| |3 |值1| |4 |值1| |5 |值1| |6 |值2| |7 |价值2| |8 |值2| |9 |值3| |10 |值3| +----+--------+ 一组10行(0.00秒) mysql>选择“列”, ->将(`column`)计数为`COUNT` ->从`表` ->按`列分组` ->按“count”DESC排序; +--------+-------+ |列|计数| +--------+-------+ |值1 | 5| |值2 | 3| |值3 | 2| +--------+-------+ 一组3行(0.00秒) 假设您需要所有行,但按某些列中值的频率排序,
`col`
,则可以执行以下操作:

CREATE TABLE tbl (id SERIAL, col VARCHAR(16));
-- INSERT so that `id` does not match frequency of values under `col`
INSERT INTO tbl (col) VALUES ('value1'), ('value2'), ('value3'),
                             ('value1'), ('value2'), ('value3'),
                             ('value1'), ('value2'),
                             ('value1'),
                             ('value1');

    SELECT id, tbl.col
      FROM tbl
INNER JOIN (  SELECT col, COUNT(1) AS freq
                FROM tbl
            GROUP BY 1) derived
           USING (col)
  ORDER BY derived.freq DESC;
那会产生什么

+----+--------+
| id | col    |
+----+--------+
|  4 | value1 |  <-- highest incidence
|  7 | value1 |
|  1 | value1 |
|  9 | value1 |
| 10 | value1 |
|  5 | value2 |
|  8 | value2 |
|  2 | value2 |
|  6 | value3 |  <-- lowest incidence
|  3 | value3 |
+----+--------+
10 rows in set (0.00 sec)
+----+--------+
|id|col|
+----+--------+
|4 | value1 |在您的示例中,您希望最终结果中有三行(按计数排序的不同“列”值),还是十行(按值频率排序的所有“列”值)?