有一个选项表,我正在尝试使用英语默认语言(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默认检索行的最佳方法? 只是想确保我不会过于复杂。
答案 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.