mysql - 数据库中的区域设置支持

标签 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 注入(inject))

最佳答案

听起来像是左外连接的工作。从您的 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。)

关于mysql - 数据库中的区域设置支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794928/

相关文章:

SQL Server : does an CTE update work like a transaction?

sql - 如何修改此 SQL 连接以包含所有列?

mysql left join返回意外数量的行

php - 显示您关注的人的所有帖子

sql - 你能帮助我停止使用 MS-Access 在我的电脑中出现崩溃错误吗?

php - 使用 DBH 在 PHP 中循环 MySQL 查询

sql - 如何将RFC822格式的nvarchar转换为sql server中的 "MM-DD-YYY"日期?

MySQL LEFT JOIN 与 SUBQUERY 非常慢

mysql - 推荐用于修改 MySQL 数据库的语言

java - Hibernate:如果外键为空,则按链接表中的字段排序