【问题标题】:Order SQL query records by frequency按频率排序 SQL 查询记录
【发布时间】:2012-01-18 01:46:33
【问题描述】:

有什么方法可以按照某个值在列中出现的频率对您从 SQL 查询中选择的记录进行排序?例如:如果有五个记录 where column = 'value1',三个 where column = 'value2',还有两个 where column = 'value3',有没有办法让结果先显示 'value1',然后显示 'value2' ,最后是'value3'?

【问题讨论】:

  • 在您的示例中,您希望最终结果中有 行(按计数排序的不同“列”值)还是 行(所有“列”值按值频率排序)?

标签: php mysql sql


【解决方案1】:
SELECT   `column`,
         COUNT(`column`) AS `count`
FROM     `table`
GROUP BY `column`
ORDER BY `count` DESC

快速概念验证:

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'); 查询正常,10 行受影响(0.00 秒) 记录:10 重复:0 警告:0 mysql> SELECT * FROM `table`; +----+--------+ |编号 |专栏 | +----+--------+ | 1 |值1 | | 2 |值1 | | 3 |值1 | | 4 |值1 | | 5 |值1 | | 6 |值2 | | 7 |值2 | | 8 |值2 | | 9 |价值3 | | 10 |价值3 | +----+--------+ 10 行一组(0.00 秒) mysql> 选择`列`, -> COUNT(`column`) 作为`count` -> 从`表` -> 按“列”分组 -> ORDER BY `count` DESC; +--------+--------+ |专栏 |计数 | +--------+--------+ |值1 | 5 | |值2 | 3 | |价值3 | 2 | +--------+--------+ 3 行一组(0.00 秒)

【讨论】:

    【解决方案2】:

    假设您想要 所有 行,但按某列 `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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2016-06-30
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多