mysql在语言环境或任何其他语言上加入翻译表

时间:2015-08-18 11:25:57

标签: mysql join locale

我正在创建一个包含不同语言产品的网站。我想从我的数据库中获取产品名称的产品列表。但是,产品的名称位于translations表中,并非每个产品都有每种语言的翻译。

这就是数据库的样子:

+-----------+       +---------------+       +-----------+
| Products  |       | Translations  |       | Languages |
+-----------+       +---------------+       +-----------+
| id        |       | product_id    |       | code      |
| ...       |       | language_code |       | ...       |
+-----------+       | value         |       +-----------+
                    +---------------+

我想做的是获取所有名称的产品。该名称应该在用户区域设置中,如果不可用,则应该是英语,如果不可用,则应该在任何可用的区域设置中。

我目前正在使用此代码,但如果当前语言环境中没有名称,则只返回null

SELECT p.*, t.value 
FROM Products p
INNER JOIN Translations t ON t.product_id = id
WHERE t.language_code = {{ locale }}
ORDER BY t.value

我是否可以使用mysql中的函数来定义应该搜索的区域设置顺序?问题是我的结果集中每个产品只需要一行。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用两个LEFT JOIN,仅在第一个值不可用时默认为英语:

SELECT p.*, COALESCE(t.value, teng.value) as value
FROM Products p LEFT JOIN
     Translations t
     ON t.product_id = p.id AND
        t.language_code = {{ locale }} LEFT JOIN
     Translations teng
     ON teng.product_id = p.id AND
        teng.language_code = 'EN'
ORDER BY value;

请注意,语言的条件需要使用ON子句而不是WHERE子句。