2016-03-02 62 views
0

我需要輸出下列順序(首先,由過去的3個字母組,然後才能安排基礎上,前3位)如何定義自定義ORDER BY在MySQL查詢

 
ColumnA 

001_eng 
004_eng 
002_chn 
003_usa 

但爲了通過ColumnA給我

 
ColumnA 

001_eng 
002_chn 
003_usa 
004_eng 

這只是示例數據。我有數百個這種格式的條目,並且這些值每天都在變化。所以,在字段中指定所有條目並不是一個可行的選擇。 我不確定如何在我的情況下使用FIELD()。

+0

什麼是您的訂單標準?從您的預期產出中看不出來。您不是按字母順序對語言或國家/地區前綴(例如eng,chn,usa等)進行排序,因此您需要說明如何確定優先級。 唯一清楚的順序標準是每個語言前綴,然後按升序順序(例如eng:001,004等) –

+0

如何對數據進行規範化? – Strawberry

+0

@strawberry:我不能改變表格,因爲我只是一個測試者,我不應該改變表格結構。 –

回答

0

拿到訂單後,您可以在情況下使用SUBSTRING_INDEX所有ColumnA值的格式爲樣本數據中:

SELECT * 
FROM mytable 
ORDER BY FIELD(SUBSTRING_INDEX(ColumnA, '_', -1), 'eng', 'chn', 'usa'), 
     SUBSTRING_INDEX(ColumnA, '_', 1) 

Demo here

+0

您的查詢不會產生Nitish的預期輸出。他沒有具體說明語言前綴的優先級。 –

+0

@JonathonOgden是的你是對的。我現在修好了。 –

+0

這正是我想要的。謝謝:) –

0

你可以使用子()和

SELECT * 
FROM table_name 
ORDER BY SUBSTRING(ColumnA, -7, 3); 
1

您可以使用FIELD:

select * 
from tablename 
order by 
    FIELD(ColumnA, '001_eng', '004_eng', '002_chn', '003_usa') 

(請注意,如果ColumnA不在列表中的場函數將返回0,行會在上面放)

,或者您可以使用CASE WHEN:

select * 
from tablename 
order by 
    case 
    when ColumnA='001_eng' then 1 
    when ColumnA='004_eng' then 2 
    when ColumnA='002_chn' then 3 
    when ColumnA='003_usa' then 4 
    else 5 
    end 

,或者你可以使用不同的語言表,其中您指定的順序:

id | name | sortorder 
1 | 001_eng | 1 
2 | 002_chn | 3 
3 | 003_usa | 4 
4 | 004_eng | 2 

那麼你可以使用一個連接

select t.* 
from 
    tablename t inner join languages l 
    on t.lang_id = l.id 
order by 
    l.sortorder 

(具有適當的索引,這將是更好的解決方案和最佳性能)

+0

@NitishVasu fthiella的最後一個解決方案可以讓您的查詢使用自定義排序,而不需要在每次需要比較新值時在'CASE'或'FIELD'語句中對比較進行硬編碼。您還可以通過爲每個語言前綴(例如eng,chn,usa)設置排序順序而不是完整的關鍵點(例如001_eng,004_eng等)來修剪fthiella的表格, –