Php 按频率排序SQL查询记录
有没有办法按照某个值在列中出现的频率对从SQL查询中选择的记录进行排序?例如:如果有五条记录的列为'value1',三条记录的列为'value2',两条记录的列为'value3',是否有办法使结果首先显示'value1',然后显示'value2',最后显示'value3'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
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 |在您的示例中,您希望最终结果中有三行(按计数排序的不同“列”值),还是十行(按值频率排序的所有“列”值)?