2016-04-26 59 views
0

我有1個表名和語言欄。檢查並選擇第2行如果第1行不存在mysql

假設我有兩種可用的語言,id爲1和2我想選擇language = 2的所有名字,如果任何一行在language = 2中不可用,那麼我將選擇語言爲1的語言。用語言獲取該行= 1,如果語言= 2不可

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

這是一個優先級查詢。這裏有一個方法,這是非常快(尤其是與正確的索引):

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); 

這得到具有兩種以上的語言累贅。對於這一點,你可以使用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

謝謝戈登。我試過第一個查詢,它返回1行,語言= 2 – Thelearning

+0

如果我們獲取所有語言的名稱並在php循環中過濾結果,您認爲如何?表現如何?謝謝 – Thelearning

+0

@戈登,你的第一個查詢有錯誤,它應該是'not exists(從t t2選擇1,其中t2.language = 2和t2.name = t.name);'而不是't2.language = 1' – Solarflare

相關問題