php - mysql 表中的字段向上排序

标签 php mysql sql select sql-order-by

我有一个名为用户的列。我有这样的字段:user1、user2、...、user10、user11、user12、user20。但字段并不总是由用户开头

我想对这些字段进行向上排序,即我正在执行以下查询:

SELECT * FROM table ORDER BY user ASC

该查询返回: 用户1、用户10、用户11、用户12、用户2、用户20

我想要的排序如下: 用户1、用户2、用户11、用户12、用户20

我该如何进行这种排序?我使用的编程语言是 php

最佳答案

最好添加另一列包含用户的位置,然后按该列排序。但是,如果您无法更改表结构,则像这样的查询应该以正确的顺序返回行:

SELECT
  tablename.*
FROM
  tablename
ORDER BY
  SUBSTR(user,
  LEAST(
    CASE WHEN LOCATE('0', user)>0 THEN LOCATE('0', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('1', user)>0 THEN LOCATE('1', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('2', user)>0 THEN LOCATE('2', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('3', user)>0 THEN LOCATE('3', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('4', user)>0 THEN LOCATE('4', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('5', user)>0 THEN LOCATE('5', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('6', user)>0 THEN LOCATE('6', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('7', user)>0 THEN LOCATE('7', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('8', user)>0 THEN LOCATE('8', user) ELSE LENGTH(user) END,
    CASE WHEN LOCATE('9', user)>0 THEN LOCATE('9', user) ELSE LENGTH(user) END
    )) + 0

请参阅 fiddle here .

关于php - mysql 表中的字段向上排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20970096/

相关文章:

php - PHP 中的 Mysql 更新和替换语法

java - 如何在android上将JSONObject显示到TextView中

php - 使用 Drupal 可编辑时间表

php - MySQL 全文搜索 - 搜索具有精确匹配和通配符的单词,但首先获得精确匹配其他匹配

php - 可以在不实例化新对象的情况下重新打开 MYSQLI 连接吗

sql - 大型数据集的 Entity Framework 速度慢

sql - 如何使用通配符 (LIKE) 和数组 (IN) 进行选择?

php - 使用 php 根据自定义条件重新排列行

mysql - 通过 VB.NET 更新 MYSQL 记录

mysql - #1055 - SELECT 列表的表达式 #19 不在 GROUP BY 子句中并且包含非聚合列