【问题标题】:MYSQL advanced sortingMYSQL 高级排序
【发布时间】:2012-03-26 13:32:45
【问题描述】:

我有一个充满 id (tID) 的表,这些表是用开头的“w”创建的,后跟一个数字 (int) 一个点和另一个数字 (int)。

样本编号:

w1.3, w1.12, w1.1, w1.1, w2.10, w2.4

当我使用ORDER BY tID 时,返回的数组是

w1.1, w1.12, w1.2, w1.3, w2.10, w2.4.

我希望它是

w1.1, w1.2, w1.3, w1.12, w2.4, w2.10

这可以在 MYSQL 查询中实现吗?

【问题讨论】:

    标签: mysql sorting group-by mysqli sql-order-by


    【解决方案1】:

    是的,这是可能的。但是您应该考虑只存储 2 个整数,不包括 w 并在 2 列中。

    与此同时,你可以使用这个:

    ORDER BY
        CAST(SUBSTRING_INDEX(REPLACE(tID, 'w', ''), '.', 1) AS SIGNED INT)
      , CAST(SUBSTRING_INDEX(tID, '.', -1) AS SIGNED INT)
    

    【讨论】:

    • 由于目前没有那么多条目,我可能会选择这个。
    【解决方案2】:

    有可能

    select *
      from sorting 
     order by cast(substring(tID,2) as DECIMAL);
    

    请注意,这些函数需要对表中的每一行进行操作,因此如果它很大,请考虑使用其他函数。

    【讨论】:

    • 这现在将 w1.12 放在 w1.1 的前面,与以前不同。
    【解决方案3】:

    将结果传回并使用调用 MySQL 的语言进行排序可能更有效。

    例如:

    <?php
        $sql = mysql_query("select * from `sorting`");
        $arr = []; // Array() before PHP 5.4
        while($a = mysql_fetch_assoc($sql)) $arr[] = $a;
        usort($arr,function($a,$b) { // use create_function before PHP 5.3
            return strnatcasecmp($a['tID'],$b['tID']);
        });
        // $arr is now ordered the way you wanted it in the query
        // but there is no ordering in MySQL, which may improve performance
        // depending on the database engine you're using.
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 2020-02-26
      • 2013-03-24
      • 1970-01-01
      • 2012-03-12
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多