0

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

4

2 回答 2

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。)

于 2013-02-10T05:18:52.283 回答
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 演示


编辑

如果您不希望以当地语言 ( 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 演示

于 2013-02-10T05:27:08.333 回答