【问题标题】:How to order 1,2,3 not 1, 10, 11, 12 in mySQL如何在 mySQL 中订购 1、2、3 而不是 1、10、11、12
【发布时间】:2010-12-22 10:18:21
【问题描述】:

以下代码按照id的1、10、11、12的顺序输出。

我想把它变成 1,2,3,4...

谁能告诉我该怎么做。

$Q = $this->db->query('SELECT P.*, C.Name AS CatName FROM products AS P LEFT JOIN categories C ON C.id = P.category_id');

提前致谢。

【问题讨论】:

  • 我假设您已经尝试将ORDER BY P.id (明显)添加到查询中?

标签: mysql sql-order-by


【解决方案1】:

您可以通过以下方式进行显式转换:

ORDER BY CAST(category_id AS UNSIGNED INTEGER)

但是您应该重新考虑您的数据库布局,因为仅包含数值的字段也应该是数字类型..

最好的祝愿, 费边

【讨论】:

  • 这也对我使用 SQLite 有所帮助,其中 - 出于某种原因 - REAL 列没有按数字排序。
【解决方案2】:

如前所述,MySQL 不支持字母数字排序。解决这个问题的一个常见技巧是按长度排序:

ORDER BY LENGTH(column_name), column_name

只要值的非数字部分长度相同,这将在 10 之前排序 1,在 100 之前排序 10,等等。

【讨论】:

  • 这解决了我的 ORDER BY 'role' 列问题:'telemarketer1', 'telemarketer10', 'telemarketer2'
【解决方案3】:

Order by 仅适用于数值(int),不适用于varchar, char

您的 category_id 应该是数字,否则您需要将值转换为数字。

【讨论】:

    【解决方案4】:

    确保包含1,2,3,4的列是INT类型,如果是TEXT,你不会得到数字顺序,而是你描述的1,10,11,2,22,23 , 31 等;

    和其他人提到的一样,使用ORDER BY

    【讨论】:

      【解决方案5】:

      首先,在末尾添加一个order by子句:

      ORDER BY category_id
      

      如果 category_id 是一个字符串,那么您必须将其视为一个整数。有几种方法可以做到这一点。我通常加一个零。你也可以投射它。

      ORDER BY category_id + 0
      

      【讨论】:

      • "category_id" 显然应该是您要排序的任何字段。
      • 很棒的解决方案!
      • 完美,你成就了我的一天!
      【解决方案6】:

      好吧,你没有设置任何ORDER BY 子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 2022-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        相关资源
        最近更新 更多