mysql连接第二个表中的一行

8ehkhllq  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(259)

我有两张table:一张是餐馆的,里面有基本的信息,另一张是描述翻译。第二个表包含以下列: restaurant_id , description , language 客户机应用程序请求餐馆列表,并传递它想要结果的语言。所以现在我需要把这两个表连接起来。如果每家餐厅都有可用语言的描述,一切都会很容易,但事实并非如此。一些餐馆缺少一些语言的描述。
因此,如果在所选语言中缺少描述,我应该返回一个默认语言的描述(顺其自然) eng 例如)。
所以问题是,如果所选语言中的描述可用,我如何以这种方式连接表-与之连接,否则-与之连接 eng ?

svmlkihl

svmlkihl1#

另一种解决方案是使用临时表选择具有翻译的餐厅的ID,然后使用union将具有翻译的餐厅+所有默认餐厅(不包括具有翻译的餐厅ID)组合在一起:
创建ID为的临时表:

CREATE TEMPORARY TABLE IF NOT EXISTS existing_ids AS (SELECT r.id FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'fr');

选择具有转换的行:

SELECT r.name, t.description FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'fr'

具有默认转换(不包括临时表中的ID)的行的并集:

UNION 
SELECT r.name, t.description FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'en' AND id not in (SELECT id from existing_ids)

演示:http://sqlfiddle.com/#!9/d3e66dc/1号

p3rjfoxz

p3rjfoxz2#

您所能做的是用所选的语言左键联接到翻译表上,也可以用默认语言再次内部联接到翻译表上。
那你可以用 COALESCE 选择第一个非空值。例如

SELECT r.name, COALESCE(t.description, t_default.description) as description
FROM restaurant r
LEFT JOIN translation t ON r.id = t.restaurant_id
  AND t.lang = 'fr' -- the chosen language
INNER JOIN translation t_default ON r.id = t_default.restaurant_id
  AND t_default.lang = 'en' -- the default language

演示~http://sqlfiddle.com/#!9/aa68c0/1号
我用过 INNER JOIN 以确保有值可显示。如果你对一个可能的 NULL 结果,将其更改为 LEFT JOIN .

相关问题