我有两张桌子:
产品:
id | sku
0 P323
1 K534
翻译:
product_id | lang | name
0 en Some product
0 sl Nek izdelek
1 en Some other product
现在,我需要显示斯洛文尼亚语(sl)翻译,但如果不存在,则应显示英语翻译。
我正在寻找一种获取产品的方法,其结果如下:
id | sku | name
0 P323 Nek izdelek
1 K534 Some other product
使用MySQL可以实现单个查询吗?
注意:转换表中的条目可能不存在或存在,但所有值(外键除外)都可以为空。
按要求编辑: 我需要有一个选项,让特权后端用户创建尽可能多的文本字段,因为电子商店需要它们用于产品展示(例如简短说明,包装内容,保修信息......)。因此,我宁愿不将列名硬编码到SQL查询中,因为这会降低可移植性 我需要选择所有翻译字段而不指定列名,如“translation。*” 如果找不到实际的解决方案,我将使用维护自定义列的记录,这些列在构建查询时(在执行查询之前)添加。
答案 0 :(得分:5)
如果两个翻译都缺失,则名称显示为NULL
SELECT p.id, sku, IFNULL(tr.name,en.name) as name
FROM product p
LEFT JOIN translation en ON p.id = en.product_id and en.lang = 'en'
LEFT JOIN translation tr ON p.id = tr.product_id and tr.lang = 'sl'
另见IFNULL
的文档OR与COALESCE以获得更好的性能
SELECT p.id, sku, COALESCE(tr.name,en.name) as name
FROM product p
LEFT JOIN translation en ON p.id = en.product_id and en.lang = 'en'
LEFT JOIN translation tr ON p.id = tr.product_id and tr.lang = 'sl'