我正在尝试按升序从数据库中检索数据。
我的查询是
select pid
from `patient_list` t1, patient_info t2
where pid > '2000' and t2.id=t1.id
order by pid asc
limit 10
但数据就像
pid
2221
2223
2224
2227
**223**
2238
2239
2242
2245
2247
**225**
如何排序?
您的数据按字母数字排序。要强制进行数字排序,您必须将数据转换为数字。例如与pid * 1
select pid
from `patient_list` t1, patient_info t2
where pid > '2000'
and t2.id=t1.id
order by pid * 1 asc
limit 1
由于您pid
是字符串类型,因此您应该考虑将其更改为int
.
您的 pid 列似乎不是数字字段类型,因此这些值被视为字符串值。在您的情况下,order-by-algorithm 是按 char 对整个字符串 char 进行排序,而不是按数字的实际值排序
2227, 223, 2238
会像AAAG, AAB, AABG
我假设它的varchar,尝试将其更改为INT
为了做到这一点,您应该按 pid 的长度和它本身的长度进行排序。这个技巧甚至适用于非整数 pid。
select pid from patient_list t1, patient_info t2
where length(pid) >= 4 and pid > '2000' and t2.id=t1.id
order by length(pid) asc, pid asc limit 1
首先,清理数据。其次,强制转换为 int。第三次排序和/或过滤。
select pid from `patient_list` t1, patient_info t2
where replace(pid, "*", "") + 0 > 2000 and t2.id = t1.id
order by replace(pid, "*", "") + 0
limit 1
请注意,您也在对该字段进行过滤,因此您应该使用替换逻辑两次。