MySQL加入null?

Ome*_*bic 0 mysql sql

我有两张桌子:

产品:

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.*".
如果找不到实际的解决方案,我将使用维护自定义列的记录,这些列在构建查询时(执行之前)添加.

rau*_*hen 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'
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)

  • [`coalesce`](http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce)比`isnull`更好. (2认同)