AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 5422
Accepted
moonw
moonw
Asked: 2011-09-06 13:14:50 +0800 CST2011-09-06 13:14:50 +0800 CST 2011-09-06 13:14:50 +0800 CST

MySQL:有条件的 ORDER BY 仅对一列

  • 772

您好,感谢您花时间阅读这个问题。

我正在使用 MySQL,并且我想使用 ORDER BY 将结果排序到一个特定的列,但是必须根据该列的特定条件对结果进行排序。例如,对于下表,我想ORDER BY 'group',首先显示9,7,6 'group' items和,最后显示10,8,5 'group' items:

names     group
--------- ------
susanita  10
miguelito 5
mafalda   7
manolito  8
libertad  6
felipe    9
guille    8

提前致谢。

mysql order-by
  • 4 4 个回答
  • 6332 Views

4 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-09-06T14:32:16+08:002011-09-06T14:32:16+08:00
    SELECT* FROM mytable ORDER BY
    LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');
    

    我获取了您的示例数据,将其加载到名为 mytable 的表中并运行它。

    结果如下:

    mysql> use test
    Database changed
    mysql> drop table if exists mytable;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> create table mytable
        -> (
        ->    names varchar(10),
        ->    `group` int
        -> );
    Query OK, 0 rows affected (0.08 sec)
    
    mysql> insert into mytable values
        -> ('susanita',  10),
        -> ('miguelito', 5),
        -> ('mafalda',   7),
        -> ('manolito',  8),
        -> ('libertad',  6),
        -> ('felipe',    9),
        -> ('guille',    8);
    Query OK, 7 rows affected (0.09 sec)
    Records: 7  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM mytable;
    +-----------+-------+
    | names     | group |
    +-----------+-------+
    | susanita  |    10 |
    | miguelito |     5 |
    | mafalda   |     7 |
    | manolito  |     8 |
    | libertad  |     6 |
    | felipe    |     9 |
    | guille    |     8 |
    +-----------+-------+
    7 rows in set (0.00 sec)
    
    mysql> SELECT * FROM mytable ORDER BY
        -> LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');
    +-----------+-------+
    | names     | group |
    +-----------+-------+
    | felipe    |     9 |
    | mafalda   |     7 |
    | libertad  |     6 |
    | susanita  |    10 |
    | manolito  |     8 |
    | guille    |     8 |
    | miguelito |     5 |
    +-----------+-------+
    7 rows in set (0.01 sec)
    
    mysql>
    

    试试看 !!!

    更新 2011-09-06 12:33 EDT

    这是另一种方法:

    SELECT* FROM mytable ORDER BY
    IF(FIELD(`group`,9,7,6,10,8,5)=0,99999,FIELD(`group`,9,7,6,10,8,5));
    

    这将强制 9、7、6、10、8、5 以外的任何组出现在查询的最底部。

    更新 2011-09-06 14:39 EDT

    mysql> SELECT names, `group`
        -> FROM mytable
        -> WHERE `group` IN (9,7,6,10,8,5)
        -> ORDER BY find_in_set(`group`,'9,7,6,10,8,5');
    +-----------+-------+
    | names     | group |
    +-----------+-------+
    | felipe    |     9 |
    | mafalda   |     7 |
    | libertad  |     6 |
    | susanita  |    10 |
    | manolito  |     8 |
    | guille    |     8 |
    | miguelito |     5 |
    +-----------+-------+
    7 rows in set (0.00 sec)
    

    嘿@Nick,你的也适用于我的样本数据!

    • 4
  2. Nick Chammas
    2011-09-07T08:58:43+08:002011-09-07T08:58:43+08:00

    使用 MySQL 的find_in_set()函数来执行此操作。它比gbn 提出 的CASE 方法更简洁,但可移植性较差。

    例如:

    SELECT `names`, `group`
    FROM my_table
    WHERE `group` IN (9,7,6,10,8,5)
    ORDER BY find_in_set(`group`,'9,7,6,10,8,5');
    

    因为它依赖于字符串搜索,find_in_set()所以主要用于对一小组易于搜索的键(如整数)进行排序。

    • 4
  3. gbn
    2011-09-06T20:39:49+08:002011-09-06T20:39:49+08:00

    通常(在 SO 中每天都会询问)您会使用标准 SQL 的 CASE

    ORDER BY
        CASE group
              WHEN 9 THEN 1
              WHEN 7 THEN 2
              WHEN 6 THEN 3
              WHEN 10 THEN 4
              WHEN 8 THEN 5
              WHEN 5 THEN 6
              ELSE 7
        END
    

    我很想看看这在大型数据集上与 RolandoMySQLDBA 的 LOCATE(CONCAT...) 方法的比较

    有关更复杂的示例,请参阅ORDER BY CASE 表达式的“转换失败”错误

    • 3
  4. Derek Downey
    2011-09-06T15:01:10+08:002011-09-06T15:01:10+08:00

    您可以将其创建为ENUM类型。

    ENUM 值根据枚举成员在列规范中列出的顺序进行排序。(换句话说,ENUM 值是根据它们的索引号排序的。)例如,对于 ENUM('a', 'b'),'a' 在 'b' 之前排序,但对于 ENUM,'b' 在 'a' 之前排序('b','a')。

    因此,将 ENUM 字段创建为ENUM('9','7','6','10','8','5')

    免责声明:我不赞同这一点,因为我怀疑您的group专栏需要是动态的。我只是提到它作为一种选择。

    • 2

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve