首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助在PHP中连接来自SQL的多个表

需要帮助在PHP中连接来自SQL的多个表
EN

Stack Overflow用户
提问于 2011-03-14 02:43:31
回答 3查看 240关注 0票数 0

假设我有三张桌子:

表1称为“状态”:

代码语言:javascript
复制
id | state
1    italy
2    netherlands
3    russia

表2称为“旅馆”:

代码语言:javascript
复制
id | hotel name | belongsToCountry
1    Green Hotel  2
2    Luxurious    2
3    Get Warm!    3

表3称为“免费客房”:

代码语言:javascript
复制
id | roomID | belongsToHotel
1    815      2
2    912      2
3    145      1
4    512      1
5    1200     3

现在,我需要回应的是:

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

一句话:我需要列出,所有州,,其中有,至少有一个免费房间,,并且我需要返回的确切值,有多少个免费房间。

如果有人能帮我,我会很感激的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-14 03:07:09

让我们一步一步地构建查询。

首先,我们来整理一下酒店的名单和他们的免费客房数量。

代码语言:javascript
复制
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中只会有一行。

有了这个,我们现在可以加入反对名单的国家。

代码语言:javascript
复制
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_idfree_rooms应该是idroom_namehotel_id。(我也可以说states.id应该是states.state_idhotels.id应该是hotels.hotel_idfree_rooms.id应该是free_rooms.room_id,因为这使得连接更加容易.)

如果您需要表示“属于”关系,那么您实际上是在寻找外键约束。您应该使用这些而不是特殊的命名。

我刚才说到哪儿了?哦,是的。第二个查询将生成一个包含三列的结果集--酒店id、其中的房间数以及它所在的国家。但是,你只需要每个国家的房间数量,所以让我们做最后一次改变。

代码语言:javascript
复制
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

只有两个变化。首先,我们现在按州分组。第二,我们不再将酒店标识包括在结果集中。这将为您提供所需的数据,再次假设当房间不空闲时,free_rooms中永远不会有一行。

票数 5
EN

Stack Overflow用户

发布于 2011-03-14 03:02:42

原始查询-未测试:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-03-14 03:06:00

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5294210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档