代码之家  ›  专栏  ›  技术社区  ›  C. Ball

如何使SQL内部联接绕过表?

  •  1
  • C. Ball  · 技术社区  · 6 年前

    我有以下四个数据库表:

    civilizations(
        civilization_id    PRIMARY KEY
        civilization_name
        civilization_leader
    )
    
    cities(
        city_id            PRIMARY KEY
        civilization_id    REFERENCES civilizations.civilization_id
        city_name
        city_population
    )
    
    city_buildings(
        city_building_id    PRIMARY KEY
        city_building_name  
        city_id             REFERENCES cities.city_id
        building_id         REFERENCES buildings.building_id
    )
    
    buildings(
        building_id         PRIMARY KEY
        building_name
    )
    

    我想写一个SELECT语句,显示每个建筑的名称(存储在city\u building\u name中)、建筑类型(存储在building\u name中)、所在城市的名称(存储在city\u name中)以及控制该城市的文明的名称(存储在civilion\u name中)。

    以下是我目前掌握的情况:

    SELECT city_buildings.city_building_name, buildings.building_name, cities.city_name
    FROM city_buildings
    INNER JOIN buildings ON city_buildings.building_id = buildings.building_id
    INNER JOIN cities ON city_buildings.city_id = cities.city_id
    

    该查询有效,并获得了前三个必填字段,但我不知道如何获得控制每个城市的文明的名称,因为我从中指定的city\u buildings表没有直接引用文明表中的文明名称字段,我不知道如何编写一个内部连接,它将绕过cities表并从文明表中获得我需要的值。

    我运行的关系数据库管理系统是MySQL。请将任何完整的答案作为适当的答复发布,而不仅仅是作为我的问题帖子下的评论(但任何问题都可以在评论中发表)。谢谢

    1 回复  |  直到 6 年前
        1
  •  4
  •   William J.    6 年前

    您可以使用 civilization_id cities 要与连接的表 civilizations 然后从那里得到文明的名称。

    SELECT
       cb.city_building_name,
       b.building_name,
       ct.city_name,
       civ.civilization_name
    FROM city_buildings cb
    INNER JOIN buildings b 
        ON cb.building_id = b.building_id
    INNER JOIN cities ct
        ON cb.city_id = ct.city_id
    INNER JOIN civ
        ON civ.civilization_id = ct.civilization_id
    

    在长连接中,有时使用别名使查询更具可读性很有用。

    表引用可以使用tbl\U名称作为别名或tbl\U名称别名来别名:

    https://dev.mysql.com/doc/refman/5.7/en/join.html