需要帮助从PHP中的SQL连接多个表

Ric*_*uez 0 php mysql sql

假设我有3个表:

表1称为"状态":

id | state
1    italy
2    netherlands
3    russia
Run Code Online (Sandbox Code Playgroud)

表2称为"酒店":

id | hotel name | belongsToCountry
1    Green Hotel  2
2    Luxurious    2
3    Get Warm!    3
Run Code Online (Sandbox Code Playgroud)

表3称为"免费房间":

id | roomID | belongsToHotel
1    815      2
2    912      2
3    145      1
4    512      1
5    1200     3
Run Code Online (Sandbox Code Playgroud)

现在,我需要回应的是:

荷兰有4间免费客房.
俄罗斯有1个免费房间.

在话:我需要做的清单所有国家具有至少1的自由空间,我需要返回的准确值多少免费客房也有.

如果有人能帮助我,我会非常感激!

Cha*_*les 5

让我们一步一步构建查询.

首先,让我们汇总酒店列表及其免费房间数.

SELECT hotels.id, COUNT(*)
  FROM hotels
       INNER JOIN free_rooms ON(hotels.id = free_rooms.belongsToHotel)
 GROUP BY hotels.id
Run Code Online (Sandbox Code Playgroud)

INNER JOINhotels如果在"right"(free_rooms)上有相应的表,则仅在join()的"left"侧的表中强制行包含在结果集中.我在这里假设房间空闲时只会有一排free_rooms.

有了这个,我们现在可以加入反对列表国家.

SELECT hotels.id, COUNT(*), states.state
  FROM hotels
       INNER JOIN free_rooms ON(hotels.id = free_rooms.belongsToHotel)
       INNER JOIN states ON(hotels.belongsToCountry = states.id)
 GROUP BY hotels.id
Run Code Online (Sandbox Code Playgroud)

顺便说一下,应该注意的是,在命名这些列时你做出了糟糕的选择. states应当由id和state_name,hotels应该是id,hotel_name,state_id,和free_rooms应id,room_name和hotel_id.(我也可以说,states.id应该是states.state_id,hotels.id应该是hotels.hotel_id和free_rooms.id应free_rooms.room_id,因为这使得连接更容易...)

如果您需要表示"属于"关系,那么您实际上是在寻找外键约束.您应该使用它们而不是特殊命名.

*唉*我在哪儿?哦,是的.第二个查询将产生一个包含三列的结果集 - 酒店ID,其中的房间数以及所在的国家/地区.但是,您只需要每个国家/地区的房间数量,所以让我们做最后一次更改.

SELECT COUNT(*), states.state
  FROM hotels
       INNER JOIN free_rooms ON(hotels.id = free_rooms.belongsToHotel)
       INNER JOIN states ON(hotels.belongsToCountry = states.id)
 GROUP BY states.state
Run Code Online (Sandbox Code Playgroud)

只有两个变化.首先,我们现在正在按州分组.其次,我们不再在结果集中包含酒店ID.这应该可以为您提供所需的数据,同样假设free_rooms房间不空闲时永远不会有一行.