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

时间:2011-03-14 02:43:31

标签: php mysql sql

假设我有3张桌子:

表1称为“州”:

id | state
1    italy
2    netherlands
3    russia

表2称为“酒店”:

id | hotel name | belongsToCountry
1    Green Hotel  2
2    Luxurious    2
3    Get Warm!    3

表3称为“免费房间”:

id | roomID | belongsToHotel
1    815      2
2    912      2
3    145      1
4    512      1
5    1200     3

现在,我需要回应的是:

  

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

用语言说: 我需要列出所有州,其中至少有一个免费房间,我需要返回有多少免费房间的确切值

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

3 个答案:

答案 0 :(得分:5)

让我们逐步构建查询。

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

SELECT hotels.id, COUNT(*)
  FROM hotels
       INNER JOIN free_rooms ON(hotels.id = free_rooms.belongsToHotel)
 GROUP BY hotels.id

INNER JOIN强制来自联接(hotels)“左”侧表格的行只有在“右”对应表格时才包含在结果集中( free_rooms)。我在这里假设当房间空闲时,只会在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

顺便说一下,你应该注意到你在命名这些列时做出了糟糕的选择。 states应由idstate_name组成,hotels应为idhotel_namestate_id和{{1}应该是free_roomsidroom_name。 (我还可以说hotel_id应该是states.idstates.state_id应该是hotels.idhotels.hotel_id应该是free_rooms.id因为这会使联接变得更多容易...)

如果您需要代表“属于”关系,那么您实际上正在寻找foreign key restraints。您应该使用这些而不是特殊命名。

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

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 中永远不会有一行。

答案 1 :(得分:1)

原始查询 - 未经测试:

SELECT state, COUNT( roomID ) AS rooms
FROM states
INNER JOIN hotels ON belongsToCountry = state.id
INNER JOIN free_rommms ON belongsToHotel = hotels.id

GROUP BY state

答案 2 :(得分:0)

SELECT state, COUNT(*) AS nb
FROM states AS S, hotels AS H, rooms AS R
WHERE S.id = H.belongsToCountry
AND H.id = R.belongsToHotel
GROUP BY state
HAVING nb >= 1