【问题标题】:php mysql sort result by value of field using position of substringphp mysql使用子字符串的位置按字段值排序结果
【发布时间】:2015-08-12 17:23:06
【问题描述】:

我有字段名称“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 ")

但无法得到完整的结果。

【问题讨论】:

标签: php mysql sorting substring


【解决方案1】:

这个表达式:

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 值,但在其他地方有所不同......尤其是考虑到您在 SELECT 中返回 codehead列表。

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

【讨论】:

  • 完全正确,它点击了,按我的意愿正常工作。在这种情况下,您对第五行“09”的担忧会出现在“10”之前,我只想这样。非常感谢
【解决方案2】:

你可以这样做:

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 的字符串。然后,您可以对其进行索引和排序。更好的是,将所有三个值拆分为各自的字段,然后您可以根据需要进行索引和排序。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2022-06-11
    • 2015-12-20
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多