数据库中的区域设置支持

时间:2013-02-10 05:13:30

标签: mysql sql join

在我的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注入)

2 个答案:

答案 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