我有1个包含名称和语言列的表。
假设我有2种语言可用,ID为1和2我想选择语言= 2的所有名称,如果语言= 2中没有任何行,那么我将选择语言为1的语言。如果language = 2不可用,则语言= 1的行
ID language name(as code)
1 1 name_1
2 2 name_1
3 1 name_2
我想得到这样的东西:
ID language name
1 2 name_1
3 1 name_2
感谢您的帮助。对不起我的英文
答案 0 :(得分:0)
这是优先级查询。这是一种非常快的方法(特别是对于正确的索引):
select t.*
from t
where language = 2
union all
select t.*
from t
where language = 1 and
not exists (select 1 from t t2 where t2.language = 1 and t2.name = t.name);
使用2种以上语言会变得很麻烦。为此,您可以使用order by
和变量:
select t.*
from (select t.*,
(@rn := if(@n = name, @rn + 1,
if(@n := name, 1, 1)
)
) as rn
from t cross join
(select @n := '', @rn := 0) params
order by t.name,
(case when language = 2 then 1 else 2 end)
) t
where rn = 1;
您只需调整order by
子句,将语言置于您想要的任何优先级顺序。