2013-07-10 136 views
5

我有麻烦试图获取最大courseidMySQL的最大值()没有返回最大结果

数据:

coursename courseid  
---------- -------- 
0001_Course JAS9997 
0002_Course JAS9998 
0003_Course JAS9999 
0004_Course JAS10000 

查询:

SELECT max(courseid) FROM tblcourse WHERE courseid LIKE '%JAS%' 

等缩小到courseid那从JAS开始。

该查询只返回JAS9999作为最大结果,但最大courseid为JAS10000。我错过了什么吗?

+1

课程以'JAS' ___begin___应该像' 'JAS%''...课程,___contain___' JAS'会像LIKE''%JAS%'' –

回答

6

对于嵌入文本中的数字,它不能这样做MAX。它使字母排序,所以JAS9追随JAS1。你必须做一个子最大:

MAX(CAST(SUBSTRING(courseid FROM 4) AS UNSIGNED)) 
+4

它仍然是一个字符串,尽管...应该能够通过添加0,即MAX(SUBSTRING(courseid FROM 4)+0) – Orangepill

+0

这也可以投射:) – Orangepill

+1

如果课程编号在格式上不可预测,那么您始终可以加载所有内容到一个PHP数组,并做一个natsort。 – Orangepill

0

用途:

SELECT MAX(CAST(SUBSTRING(courseid,4) AS UNSIGNED)) 
FROM tblcourse 
WHERE courseid LIKE '%JAS%' 
1

很多纯SQL的解决方案,其中规定,应该在所有的课程都格式化了三个假设工作字符前缀后跟数字。我虽然会抛出一个PHP解决方案。

首先获取所有符合数组中类似子句的课程。

$matching = array(); 
while ($matching[] = $query->fetchNext()){} 

然后

natsort($matching); 
$last = end($matching); 

最后将包含在你的情况下,最后JAS10000

+0

如果有100亿条目?你建议将所有数据复制到RAM中?对于脚本的每次并发运行? –

+0

@maximkumpan我不记得那么说了,我只是说明了第二个有一个课程名称QAMS0015所有其他解决方案都失败了,这可能是一个可行的选择。 – Orangepill

+1

我会采取缓慢,并在任何一天快速和错误 – Orangepill