这是MySQL查询:
$sql = "SELECT users.*, ranks.rank_number
FROM users
INNER JOIN ranks
ON users.rank_name=ranks.rank_name
WHERE users.active= 'y'
ORDER BY ranks.rank_number ASC, users.plvl DESC
LIMIT $start, $limit";
$result = mysql_query($sql);
我想按rank_number
订购:
1,2,3,4,5,6,7,8,9,10,11,12
来自MySQL的,但我明白了:
1,11,12,10,2,3,4,5,6,7,8,9
那么如何将其设为1,2,3,4,5,6,7,8,9,10,11,12
?
答案 0 :(得分:2)
根据您的结果,您似乎正在进行字母排序。它看起来像在你的数据库中,rank_number可能存储为" varchar"而不是整数。在这种情况下,您可以将varchar转换为整数以获得数字排序而不是字母排序。
https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html
SELECT users.*, CAST (ranks.rank_number AS SIGNED) as user_rank
...
order by user_rank ASC
发布您的表格定义将有助于澄清实际情况是否正确。
答案 1 :(得分:2)
对您的陈述最快的解决方法是在+0
条款中将 ranks.rank_number
附加到ORDER BY
...
ORDER BY ranks.rank_number+0 ASC, ...
^^
如果rank_number
为CHAR
或VARCHAR
数据类型,并且您希望按 numeric 值排序,而不是对字符串进行排序,那么它将“正常工作”表示。
还有其他表达式可以实现等效结果,将字符串表示转换为数值。 “添加零”技巧是最短的修复,只是语句的两个字符添加。
通常,我们倾向于将 numeric 值存储在使用numeric数据类型(整数,小数,浮点数)声明的列中,而不是将它们存储为字符串。然后我们避免您通过订购报告的那种问题。
显示返回行的顺序非常奇怪。
您肯定 10
之后是否订购了 12
?如果按字符串值对其进行排序/排序,我们希望字符串值 10
在 11
之前。报告返回的行的顺序非常奇怪。
(如果您报告返回的行的顺序是准确的,那么我怀疑第二个字符实际上是大写字母 'O'
而不是零 {{1} } 强>
如果是这种情况,那么'0'
技巧会将 +0
(一个和大写O)转换为 '1O'+0
<的数值/ strong>,因此相当于 1
,它也会评估为 '1'+0
。
答案 2 :(得分:1)