我有一个选择产品和文本翻译的MySQL SQL查询:
SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations) t
ON t.id = p.product_id
这会从数据库中获取产品。但它会抓取所有可用的翻译。我只想获得当前语言的翻译。所以我可以用这个:
SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = 'en') t
ON t.id = p.product_id
这是按预期工作的,但并非所有产品都有每种语言的翻译。我最终想要做的是指定一种语言,如果没有给定的翻译,则返回我们所拥有的其他翻译。这可以在SQL中完成,还是需要在PHP中迭代结果?
答案 0 :(得分:2)
如果您为每个产品创建“默认”语言翻译,并为其提供代码'zz'
,则以下内容将起作用。每个产品都必须有'zz'
翻译。
(这花了我一个小时,但我在这个过程中学到了很多东西 - 很棒的问题!)。
SELECT *
FROM products p
LEFT JOIN translations t
ON (p.id == t.product_id
AND (t.lang == 'en'
OR (t.lang == 'zz' AND
'en' NOT IN
(SELECT `lang` FROM translations t2 WHERE t2.product_id == p.id)
)
)
);
抱歉,如果效率不高。你需要尝试一下才能看到。
答案 1 :(得分:0)
一种方法是添加另一个LEFT JOIN,用于提取该产品ID的任何语言的第一个翻译。如果第一个翻译(使用所需语言)不可用,请使用COALESCE
语句来使用二级翻译:
SELECT
p.product_id,
COALESCE(t.lang, t2.lang),
COALESCE(t.translation, t2.translation)
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = @lang) t
ON t.id = product_id
LEFT JOIN (SELECT * FROM translations
WHERE lang = (SELECT min(lang) FROM translations
WHERE t3.id = t2.id))
t2 ON t2.id = p.product_id;