php mysql使用substring的位置按字段值排序结果

时间:2015-05-29 18:15:06

标签: php mysql sorting substring

我有字段名称" codehead"其值如

"53/066/10" 
"54/066/05" 
"56/066/09" 
"52/069/15" 
"53/069/02"
"67/069/02"
"00/020/80"
"00/020/98"

我希望结果按以下顺序

"00/020/80"
"00/020/98"
"53/066/05"
"53/066/10"
"54/066/09"
"52/069/15" 
"53/069/02"
"67/069/02"

我尝试了像

这样的查询
$data= mysql_query("select codehead,sign, SUM(amt) as amt from pm where month='$pmmonth' and rc='R' GROUP BY substr(codehead,4,3) ASC,substr(codehead,7,2) ASC,  sign ")

但无法获得完整的结果。

2 个答案:

答案 0 :(得分:0)

这个表达式:

substr(codehead,7,2)

返回正斜杠和数字。看起来你想从第8位开始。

但是这不符合显示的顺序,第五行有09,而前一行的 10之前会出现。显示的所需结果使得看起来结果也在LEFT(codehead,2)

上排序
 GROUP BY codehead, `sign`
 ORDER BY substr(codehead,4,3)  ASC
        , LEFT(codehead,2)      ASC
        , substr(codehead,8,2)  ASC

注意:在MySQL的某个未来版本中,GROUP BY的非标准MysQL扩展名可能会删除ORDER BY

我非常怀疑只有子串的GROUP BY。这是有效的SQL,我只是质疑你想如何处理匹配在子串上的codehead值,但在其他地方是不同的......特别是考虑到你正在返回codehead SELECT列表。

规范模式是GROUP BY列表中的SELECT个表达式。

答案 1 :(得分:0)

您可以这样做:

SELECT codehead,
  substring(codehead,1,2) as 'one',
  substring(codehead,4,3) as 'two',
  substring(codehead,8,2) as 'three'
FROM foo
ORDER BY `two`, `one`, `three` ASC

SQLfiddle

它将工作,但它会有低于平均水平的性能,因为无法使用那种索引。

要解决此问题,您可以向表中添加新字段,例如sortkey,并为每行插入格式为$two.$one.$three的字符串。然后你可以对它进行索引和排序。更好的是,将所有三个值拆分到它们自己的字段中,然后您可以根据需要进行索引和排序。