我需要輸出下列順序(首先,由過去的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()。
我需要輸出下列順序(首先,由過去的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()。
拿到訂單後,您可以在情況下使用SUBSTRING_INDEX
所有ColumnA
值的格式爲樣本數據中:
SELECT *
FROM mytable
ORDER BY FIELD(SUBSTRING_INDEX(ColumnA, '_', -1), 'eng', 'chn', 'usa'),
SUBSTRING_INDEX(ColumnA, '_', 1)
您的查詢不會產生Nitish的預期輸出。他沒有具體說明語言前綴的優先級。 –
@JonathonOgden是的你是對的。我現在修好了。 –
這正是我想要的。謝謝:) –
你可以使用子()和
SELECT *
FROM table_name
ORDER BY SUBSTRING(ColumnA, -7, 3);
您可以使用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
(具有適當的索引,這將是更好的解決方案和最佳性能)
@NitishVasu fthiella的最後一個解決方案可以讓您的查詢使用自定義排序,而不需要在每次需要比較新值時在'CASE'或'FIELD'語句中對比較進行硬編碼。您還可以通過爲每個語言前綴(例如eng,chn,usa)設置排序順序而不是完整的關鍵點(例如001_eng,004_eng等)來修剪fthiella的表格, –
什麼是您的訂單標準?從您的預期產出中看不出來。您不是按字母順序對語言或國家/地區前綴(例如eng,chn,usa等)進行排序,因此您需要說明如何確定優先級。 唯一清楚的順序標準是每個語言前綴,然後按升序順序(例如eng:001,004等) –
如何對數據進行規範化? – Strawberry
@strawberry:我不能改變表格,因爲我只是一個測試者,我不應該改變表格結構。 –