2015-05-29 37 views
0

的位置導致我有字段名「codehead」像PHP MySQL的排序字段中的值使用子

"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 ") 

但無法獲得完整的結果。

+1

請[停止使用'mysql_ *'函數](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。他們不再被維護,並[正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。瞭解[準備的陳述](http://en.wikipedia.org/wiki/Prepared_statement),並考慮使用PDO,[它不像你想象的那麼難](http://jayblanchard.net/demystifying_php_pdo.html) 。 –

回答

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值匹配的子字符串,但在另一個地方是不同的......特別是鑑於你在SELECT列表中返回codehead

規範模式是在SELECT列表中的GROUP BY表達式。

+0

絕對正確,它點擊,按我的需要正常工作。在這種情況下,你對於第十行「09」的擔憂會在「10」之前發生,我只是想這樣。非常感謝 –

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的字符串。然後你可以索引和排序。更好的是,將所有三個值分割到各自的字段中,然後您可以根據需要進行索引和排序。