MySQL,如果列等于,选择行?否则选择使用默认值

时间:2010-12-13 16:59:43

标签: sql mysql

有一个选项表,我正在尝试使用英语默认语言(languageID 1)制作多语言。

表:

 optionID   optionName  optionValue  languageID  
 -----------------------------------------------
 1          opt1        Language     1-1  
 2          opt1        Language     2-2  
 3          opt2        Language     1-1

查询:

SELECT t3.optionName, 
       t3.optionValue
  FROM (SELECT t2.optionName, 
               t2.optionValue 
          FROM tbl_options t2
         WHERE t2.optionName IN ('opt1', 'opt2') 
           AND (t2.languageID = 2 OR t2.languageID = 1)
      ORDER BY t2.languageID DESC) t3
GROUP BY t3.optionName

如果找不到匹配项,上述查询是否是基于languageID默认检索行的最佳方法? 只是想确保我不会过于复杂。

3 个答案:

答案 0 :(得分:2)

这是基于英语是最低语言ID的假设:

select t.optionName, t.optionValue
from (
    SELECT optionName, max(languageID) as MaxLanguageID
    FROM tbl_options   
    WHERE optionName IN ('opt1', 'opt2') 
        AND languageID in (1, 2)  
    group by optionName
) tm
inner join tbl_options t on tm.optionName = t.optionName
    and tm.MaxLanguageID = t.LanguageID
order by t.optionName

答案 1 :(得分:0)

在你的选择中,你要抓住另一个的默认值。您可能需要查看IFNULL并尝试使用其他语言,否则请使用英语。

答案 2 :(得分:0)

如果您希望language = 1,如果特定optionName不存在language = 2,那么您也可以使用union。

select * from tbl_options t1  
where languageid = 1  
  and not exists 
           (select * from tbl_options t2  
                 where languageid <> 1  
                   and t1.optionName = t2.optionName ) 
union
select * from tbl_options  
where languageid = 2 ;

如果您只需要特定选项,请添加optionName

select * from tbl_options t1  
where languageid = 1  
  and not exists 
           (select * from tbl_options t2  
                 where languageid <> 1  
                   and t1.optionName = t2.optionName ) 
and optionName IN ('opt1', 'opt2')
union
select * from tbl_options  
where languageid = 2 
and optionName IN ('opt1', 'opt2');

我测试过它似乎有效:

create table tbl_options (optionID number, optionName varchar2(50), optionValue varchar2(50), languageId number);
insert into tbl_options values (1,'opt1','Language 1',1);
insert into tbl_options values (2,'opt1','Language 2',2);
insert into tbl_options values (3,'opt2','Language 1',1);
select * from tbl_options;    

select * from tbl_options t1  
where languageid = 1  
  and not exists 
           (select * from tbl_options t2  
                 where languageid <> 1  
                   and t1.optionName = t2.optionName ) 
union all
select * from tbl_options  
where languageid = 2 

以上输出到(我没有使用mysql但应该是相同的):

Table created.
1 row created.
1 row created.
1 row created.

  OPTIONID OPTIONNAME OPTIONVALUE  LANGUAGEID
---------- ---------- ------------ ----------
         1 opt1       Language 1   1
         2 opt1       Language 2   2
         3 opt2       Language 1   1

3 rows selected.

  OPTIONID OPTIONNAME OPTIONVALUE  LANGUAGEID
---------- ---------- ------------ ----------
         3 opt2       Language 1   1
         2 opt1       Language 2   2

2 rows selected.