我有一个“可用”列,它返回"is"或例如“30 分钟”。
为了对该表进行排序,我们发现它按预期工作,其中"is"在前,“30 分钟”在后。
按可用 + 0 asc 排序
尽管这有效,但我们不知道为什么我们必须将 +0 放入该列。有人可以详细说明吗?
编辑:这是一个查询示例
请注意,所有 where 子句都不在此处,if(x is null) 是在没有结果(即空值)时返回一些内容。
select distinct r.rname, if(b.stime is null, 'Yes', 'Yes') as available, r.mperson
from Rooms r left outer join Bookings b using (rname)
union all
select b.rname, concat(minute(timediff(b.etime, '$sdate')), ' min') as available, r.mperson
from Bookings b inner join Rooms r using(rname)
order by available + 0 asc, rname asc
最佳答案
您正在隐式地将 available
值转换为数字,正如您通过尝试看到的那样
select "30 minutes" + 0; ==> returns 30
select "2 hours" + 0; ==> returns 2
select "yes" + 0; ==> returns 0
这使得 “yes”
(或任何不以数字开头的字符串)成为第一个返回值而不是最后一个。
这确实改变了顺序,但这感觉很笨拙,而且效率低于使用纯数字字段(可以索引)。
更一般地说,您应该始终定义您的模式,例如具有精确的非多态字段。
关于mysql - 在 order 子句中使用 +0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16669123/