我正在创建一个包含不同语言产品的网站。我想从我的数据库中获取产品名称的产品列表。但是,产品的名称位于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中的函数来定义应该搜索的区域设置顺序?问题是我的结果集中每个产品只需要一行。
感谢您的帮助。
答案 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
子句。