如果第1行不存在mysql,请检查并选择第2行

时间:2016-04-26 15:59:56

标签: mysql select

我有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

感谢您的帮助。对不起我的英文

1 个答案:

答案 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子句,将语言置于您想要的任何优先级顺序。