代码之家  ›  专栏  ›  技术社区  ›  Max Pattern

带子查询的SQL查询按id对关系字段进行查询

  •  1
  • Max Pattern  · 技术社区  · 2 年前

    我想接收一个数据对象国家。对象国家/地区具有以下属性(id、continent_id、language_id)。

    Table countries {
      id, name, continent_id, language_id
    }
    
    Table continents {
      id, name
    }
    
    Table languages {
      id, name
    }
    

    而不是获取仅包含 continent_id language_id ,我想知道这个大陆的名字和语言。就像这样:

    {
      id: 1,
      name: Germany,
      continent_id: 1,
      language_id: 1,
      continent: "europe", // new field
      language: "german" // new field
    }
    

    我怎样才能做到这一点?

    2 回复  |  直到 2 年前
        1
  •  2
  •   nbk    2 年前

    你需要加入男子国家的另外两张桌子

    如果每个国家都只有一种语言,这就足以 INNER JOIN 他们

    对于乘法语言,您需要 GROUP BY 和使用 GROUP_CONCAT 或语言

    SELECT
        countr.id, contr.name, continent_id, language_id 
        , co.name as continent
        , lang.name as language
    FROM countries  countr 
    INNER JOIN continents co ON contr.continent_id = co.id
    INNER JOIN languages  lang ON lang.id = contr.language_id 
    

    如果一个国家有多种语言

    SELECT
        countr.id, contr.name, continent_id, language_id 
        , co.name as continent
        , GROUP_CONCAT(lang.name) as languages
    FROM countries  countr 
    INNER JOIN continents co ON contr.continent_id = co.id
    INNER JOIN languages  lang ON lang.id = contr.language_id 
    GROUP BY countr.id, contr.name, continent_id, language_id,co.name
    
        2
  •  0
  •   Max Pattern    2 年前

    我为我的案子找到了一个简单的解决方案。也许不是最聪明的,但它有效。可能还有更好的解决方案。我不知道数据集的大小会对性能产生什么影响。我还得测试一下。

    SELECT c.*, co.name as continent, l.name as language 
    FROM countries c  
    JOIN continents co ON co.id = c.continent_id 
    JOIN languages l ON l.id = c.language_id
    WHERE c.id IN (1,2,3);