2016-04-26 19 views
0

名前と言語の列を持つ1つのテーブルがあります。行1が存在しない場合は、行2を選択して選択します。mysql

id 1と2で2つの言語を使用できるとしましょうlanguage = 2ですべての名前を選択したい場合、language = 2で行が使用できない場合は、言語1のものを選択します。あなたの助けのための

ID language name 
1 2  name_1 
3 1  name_2 

ありがとう:私はこのような何かを取得したい= 1

言語は= 2利用できない場合
ID language name(as code) 
1 1  name_1 
2 2  name_1 
3 1  name_2 

言語で行を取得します。申し訳ありません私の英語のため

答えて

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と変数を使用することができます。

+0

ありがとうゴードン。私は最初のクエリを試して、言語= 2で1行を返します – Thelearning

+0

すべての言語で名前を取得し、PHPループで結果をフィルタリングするとどう思いますか?パフォーマンスはどうですか?ありがとう – Thelearning

+0

@ Gordon、最初のクエリに間違いがありますが、 't2.language = 2ではなくt2.language = 2とt2.name = t.name) 1' – Solarflare

関連する問題