【问题标题】:Locale support in database数据库中的语言环境支持
【发布时间】:2013-02-10 16:57:19
【问题描述】:

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

【问题讨论】:

  • 你能给样品提供想要的结果吗?

标签: mysql sql join


【解决方案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。)

【讨论】:

    【解决方案2】:

    您也可以考虑使用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

    【讨论】:

    • @user1933738 您的链接包含与我的链接相同的数据、查询和输出。结果似乎是正确的。你能告诉我哪里出了问题,我可以帮你吗?
    • 我将 s_p_l 的数据更改为 (1, 1, 'dename1', 'de_DE'),(3, 3, 'dename3', 'de_DE'), (4, 4, 'dename4 ', 'de_DE') 并且结果行仍然是 "name2"
    • @user1933738 是的,那是因为prod_id=2 不存在于s_p_l 中,它仅采用英文值name2
    • @user1933738 好了。在s_p_l 中添加了prod_id=2 的值和所需的结果。 sqlfiddle.com/#!2/c7028/4/0
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2013-01-10
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多