在我的MySQL数据库中,我将表格s_p
(id,name,prod_id)存储在英文数据中,另外还存储在另一个表s_p_l
(id,prod_id,name,locale)中产品的本地化名称(如果有)。
目前我使用
SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE";
首先检查我是否有产品#2的本地化名称,如果这不返回任何行,
SELECT name FROM s_p WHERE prod_id=2;
获取英文名称。
如果给定产品ID和区域设置,我现在如何获取一个查询,本地化的产品名称和英文版本作为后备?
(是的,我使用预准备语句来避免SQL注入)
答案 0 :(得分:1)
听起来像左外连接的工作。从您的s_p
表中选择(因为您知道值将在那里),但是对您的s_p_l
表执行左外连接。如果没有s_p_l
记录,您只会获得s_p_l
列的空值,但您仍会获得s_p
的所有匹配行。
SELECT
s_p_l.name AS localizedName,
s_p.name as fallbackName
FROM
s_p
LEFT OUTER JOIN s_p_l ON
s_p_l.prod_id = s_p.prod_id AND
s_p_l.locale = "de_DE"
WHERE s_p.prod_id = 2
您甚至可以将SELECT更改为只返回一列:SELECT ISNULL(s_p_l.name, s_p.name)
。 (我的背景是在SQL Server中,但我认为这是适用于mySQL的标准SQL。)
答案 1 :(得分:0)
您也可以考虑使用UNION
。
SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE"
union
SELECT name FROM s_p WHERE prod_id=2;
<强> SQLFIDDLE DEMO 强>
修改
如果您不希望显示英语值(如果它以当地语言(s_p_l
)显示),请使用以下查询
SELECT * FROM
(
SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE"
UNION
SELECT name FROM s_p WHERE prod_id=2) b
LIMIT 1
;
<强> SQLFIDDLE DEMO 强>