2013-12-13 58 views
1

我想根據子串對從SQL查詢返回的結果進行排序。我使用MYSQL作爲數據庫。我想實現兩個不同的結果SQL查詢,按子串排序

Sample data 
aaa ad aa 
aaa ab 
aaa ac 

1)首先,我想排序第二串的基礎上。

Result: 
aaa ab 
aaa ac 
aaa ad aa 

2)第二我想根據最後一個子字符串排序。

Result: 
aaa ad aa 
aaa ab 
aaa ac 

我該如何實現這些任務。

感謝您的幫助.. 問候

編輯1:子字符串可以是任意長度的。 另外對於第二種情況,我想根據最後一個子字符串進行排序。這意味着它可以在任何位置..

+0

是子字符串固定長度/位置,或者被他們界定? – Kickstart

+0

沒有一個子字符串是固定長度也是第二種情況,我只是想排序最後一個子字符串,它可以在任何位置...... – planet260

+0

我們如何知道我們應該如何排序字符串? – DevelopmentIsMyPassion

回答

2

試試這個:

問題1:

SELECT * FROM tableA 
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(colName, ' ', 2), ' ', -1); 

問題2:

SELECT * FROM tableA 
ORDER BY SUBSTRING_INDEX(colName, ' ', -1); 
+0

是的這個作品[http://www.sqlfiddle.com/#!2/52c57/7](http://www.sqlfiddle.com/#!2/52c57/7) –

+0

第一個問題如果沒有足夠的分隔符,將不會正確排序。例如,如果任何行只有一個子字符串,那麼它將使用該子字符串對該行進行排序,而不是將其視爲空(或者如果需要,則爲某個值)。問題是SUBSTRING_INDEX獲取所有內容到指定的索引。因此,對於'aaa ab',如果您將所有內容都提交到第二個空間,那麼它只會返回'aaa ab',然後獲取-1索引,它會返回'ab'作爲3子字符串,而不是第2個子字符串。 – Kickstart

0

一種方式做到這一點: -

SELECT SampleData, IF (LENGTH(SampleData) - LENGTH(REPLACE(SampleData, ' ', '')) >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(SampleData, ' ', 2), ' ', -1), NULL) AS OrderField 
FROM SampleTable 
ORDER BY OrderField 

檢查該字段有足夠的分隔符來獲取相關部分。如果沒有將排序字段設置爲NULL,但是如果足夠長的話抓住該字段的那一部分。然後基於它進行排序。

SQL小提琴的位置: -

http://www.sqlfiddle.com/#!2/8cd01/8

要得到最後一個字段是比較容易: -

SELECT SampleData, SUBSTRING_INDEX(SampleData, ' ', -1) AS OrderField 
FROM SampleTable 
ORDER BY OrderField