如何让我的SQL内部联接绕过表?

时间:2018-02-21 15:36:57

标签: mysql sql relational-database inner-join

我有四个数据库表:

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_building_name中),建筑物类型(存储在building_name中),它所在城市的名称(存储在city_name中),以及控制该城市的文明名称(存储在civil_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

该查询起作用并获取我前三个必填字段,但我不知道如何获取控制每个城市的文明名称,因为我在FROM之后指定的city_buildings表没有' t直接引用文明表中的civil_name字段,我不知道如何编写一个绕过cities表的INNER JOIN,并从文明表中获取我需要的值。

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

1 个答案:

答案 0 :(得分:4)

您可以使用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_name AS alias_name或tbl_name alias_name别名表引用:

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