在MySQL中按混合字母数字列排序

3
我有以下数值在我的行中(应该按照这个顺序排列);
**CLASS_CODE**
6A
6B
6C
10A
10B
10C

如果我只是简单地使用 ORDER BY CLASS_CODE,那么我会先得到10x的值,然后才是6x的值。

因此,我使用了 ORDER BY (CLASS_CODE+0),它可以正确排序使得6x首先出现,但无法根据字符顺序进行排序。

有什么正确的排序方法,能够按照上面显示的顺序得到正确的结果呢?


3
由于MySQL只进行字符串比较,因此数字1在数字6之前。你需要的是自然排序(比如在PHP中用于数组)。我不知道MySQL是否支持自然排序。 - rabudde
4个回答

3

不需要给CLASS_CODE起别名,我相信ORDER BY (CLASS_CODE+0)ASC, CLASS_CODE ASC同样可以达到同样的效果。 - Andriy M
我明白了,我以为不需要考虑两次。你一定是对的。 - BuZz
你的基本想法仍然是正确的。我既同意你的答案,也同意 @a'r 的观点。 - Andriy M

3
只要您在字段值末尾仅使用一个字母,那么您可以使用以下内容:
ORDER BY (class_code+0), right(class_code, 1)

我只有一个字母在结尾。感谢您的解决方案。 - Adnan
原帖的示例确实导致我们假设数字后面总是有一个字符,但通常情况下可能并非如此。即使是这样,您也不必提取最右边的字符。一旦您通过 (class_code+0) 得到了排序顺序,子组可以通过 class_code 简单排序。 - Andriy M

0

我曾经遇到过这种情况,我使用了CAST函数。在这种情况下,ORDER BY CAST(class_code AS DECIMAL)


0

抱歉回复晚了,但这可能会对某些人有所帮助。

您需要实现自然排序。要使用PHP进行排序,可以使用natsort()函数。

您也可以通过MySQL实现自然排序,这很简单。例如:

ORDER BY LENGTH(class_code), class_code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接