mySQL order by子句奇怪的问题

时间:2011-01-27 23:54:58

标签: sql mysql sql-order-by

我正在尝试使用以下查询对表中的数据进行排序:

通过CUST desc

从客户订单中选择*

所有参赛作品均已正确订购,但:CUST.10 如何使其正确排序,以便CUST.10显示在顶部,然后是CUST.9,CUST.8等等。

weird mysql ordering

6 个答案:

答案 0 :(得分:4)

试试这个:

SELECT * 
  FROM customers 
 ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC

工作示例:

SELECT * FROM
(
SELECT 'CUST.10' CUST 
UNION
SELECT 'CUST.9' CUST 
UNION
SELECT 'CUST.1' CUST 
) A ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC

答案 1 :(得分:1)

这是基于字符串值排序 - 而不是数字。 如果您可以将数字拆分为仅数字值 - 那么您可以对其进行排序。

答案 2 :(得分:1)

考虑将您附加到Cust字符串的数字放入整数列。现在,SQL正在varchar列CUST上进行字母数字排序。这会在每个字符索引处使用字母数字优先级进行排序。如果按整数列排序,您将得到您想要的结果。

答案 3 :(得分:0)

使用这种数据类型,你不能,字符串的自然排序(假设数据类型是字符串)导致10低于2 ... 因为它从第一个字符开始比较各个字符。第一个不相等的比较被视为解决方案。

要解决此问题,您必须使用其他一些数据字段或将其设为数字​​字段。

答案 4 :(得分:0)

不仅可以预测对字符串值进行排序,而且效率也很低。您应该考虑修改架构并为客户ID创建整数列。也可能是你已经把这个专栏作为一个关键字放在其他地方,然后肯定继续按照该专栏排序。

答案 5 :(得分:0)

您需要将名称拆分为名称和数字部分 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

SELECT *
FROM CUSTTEST
ORDER BY
    SUBSTRING_INDEX(CUST,'.',1),
    1*SUBSTRING_INDEX(CUST,'.',-1) DESC

使用样本

create table CUSTTEST (CUST varchar(20));
insert CUSTTEST VALUES
 ('CUST.10'),('CUST.3'),('CUST.9'),('CUST.1'),
 ('BOB.11'),('BOB.13'),('BOB.2'),('BOB.5'),
 ('CYBERKIWI.11'),('CYBERKIWI.1');
相关问题