实现获取多语言数据的后备

时间:2016-04-07 16:12:17

标签: mysql database-design localization multilingual

我正在根据this回答翻译现有MySQL表。在这种情况下,我正在处理menu_items,我的表结构现在看起来如下:

  • menu_items
    • ID
    • sort_position
  • menu_item_translations
    • menu_item_id
    • 语言ENUM('nl','en')
    • 标签
    • 工具提示

我现在正在寻找一种以这种方式加入这些表的方法,我可以在搜索另一种语言时使用一种语言作为后备。

标准查询将是这样的:

SELECT 
    *
FROM
    menu_items mi
INNER JOIN menu_item_translations mit
    ON mit.menu_item_id = mi.id
WHERE
    mit.language = 'en';

但是如果没有找到英文菜单项,我希望'nl'成为后备。我不太热衷于存储过程,但如果必须,我可以使用它们。

有没有办法在这个查询中实现回退,没有太多的性能损失或丑陋?

1 个答案:

答案 0 :(得分:0)

在发布此问题之后意识到答案很简单;

SELECT 
    mi.*,
    COALESCE(mit.label, mit_fb.label) AS label
FROM
    menu_items mi
LEFT JOIN menu_item_translations mit
    ON mit.menu_item_id = mi.id
    AND mit.language = 'en'
LEFT JOIN menu_item_translations mit_fb
    ON mit_fb.menu_item_id = mi.id
    AND mit_fb.language = 'nl';

这正是我想要的。