我需要输出下列顺序(首先,由过去的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:我不能改变表格,因为我只是一个测试者,我不应该改变表格结构。 –