Есть ли способ заказать записи, которые вы выбираете из SQL-запроса, тем, как часто в столбце появляется определенное значение? Например: если есть пять записей, где column = 'value1', три, где column = 'value2', а два, где column = 'value3', есть способ сделать результаты сначала отображать «value1», затем «value2», , и, наконец, «значение3»?
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`)); Запрос ОК, 0 строк затронуты (0,01 сек) mysql> INSERT INTO `table` (` column`) VALUES ('value1'), ('value1'), ('value1'), ('value1'), ('value1'), ('value2'), ( 'value2'), ('value2'), ('value3'), ('value3'); Query OK, 10 строк, затронутых (0.00 сек) Записи: 10 Дубликаты: 0 Предупреждения: 0 mysql> SELECT * FROM `table`; + ---- + -------- + | id | столбец | + ---- + -------- + | 1 | value1 | | 2 | value1 | | 3 | value1 | | 4 | value1 | | 5 | value1 | | 6 | value2 | | 7 | value2 | | 8 | value2 | | 9 | значение3 | | 10 | значение3 | + ---- + -------- + 10 строк в наборе (0,00 сек) mysql> SELECT `column`, -> COUNT (`column`) AS` count` -> FROM `table` -> GROUP BY `column` -> ORDER BY `count` DESC; + -------- + ------- + | столбец | счет | + -------- + ------- + | value1 | 5 | | value2 | 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)