代码之家  ›  专栏  ›  技术社区  ›  Vladyslav Matviienko

mysql连接第二个表中的一行

  •  -2
  • Vladyslav Matviienko  · 技术社区  · 8 年前

    我有两张桌子:一张是包含一般信息的餐厅的,另一张是描述翻译的。第二个表有这样的列:

    restaurant_id , description , language

    客户端应用程序请求餐厅列表,并通过 语言 它想要结果。所以现在我需要加入这两个表。如果每个餐厅都有可用语言的描述,一切都会很容易,但事实并非如此。一些餐馆缺少一些语言的描述。

    因此,如果所选语言中缺少描述,我应该在 违约 语言(顺其自然 eng 例如)。

    所以问题是,如果所选语言中的描述可用,我如何才能以这种方式连接表-使用它连接,否则-使用 英格 ?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Phil    8 年前

    你能做的就是 左连接 在你的身上 翻译 使用所选语言和 内连接 到上面 翻译 再次使用默认语言。

    那你就可以用 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 。

        2
  •  0
  •   Vladyslav Matviienko    8 年前

    另一个解决方案是使用临时表选择有翻译的餐厅的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