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