2016-03-02 63 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的表格, –