2

我有一列“可用”,它返回“是”或例如“30 分钟”。为了对这个表进行排序,我们发现这在“是”首先出现,“30 分钟”出现在后面的地方按预期工作。
order by available + 0 asc
即使这可行,我们也不知道为什么我们必须将 +0 放在列中。有人可以详细说明吗?

编辑:这是一个查询示例
请注意,所有 where 子句都不在这里,并且 if(x is null) 如果没有结果,也就是 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
4

1 回答 1

4

available正如您通过尝试看到的那样,您正在隐式地将值转换为数字

select "30 minutes" + 0; ==> returns 30
select "2 hours" + 0; ==> returns 2
select "yes" + 0; ==> returns 0

这使得"yes"(或任何不以数字开头的字符串)成为第一个返回值,而不是最后一个。

确实改变了顺序,但这感觉很hacky并且效率低于使用纯数字字段(可以被索引)。

更一般地,您总是应该定义您的模式,例如具有精确的非多态字段。

于 2013-05-21T11:42:11.117 回答