0

我正在尝试按升序从数据库中检索数据。

我的查询是

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**

如何排序?

4

4 回答 4

6

您的数据按字母数字排序。要强制进行数字排序,您必须将数据转换为数字。例如与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.

于 2013-10-04T06:25:44.750 回答
0

您的 pid 列似乎不是数字字段类型,因此这些值被视为字符串值。在您的情况下,order-by-algorithm 是按 char 对整个字符串 char 进行排序,而不是按数字的实际值排序

2227, 223, 2238会像AAAG, AAB, AABG

我假设它的varchar,尝试将其更改为INT

于 2013-10-04T06:32:41.003 回答
0

为了做到这一点,您应该按 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
于 2013-10-04T06:36:36.317 回答
0

首先,清理数据。其次,强制转换为 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

请注意,您也在对该字段进行过滤,因此您应该使用替换逻辑两次。

于 2013-10-04T06:41:46.213 回答