MySQL合并我的选择在一起


MySQL Merging my selects together

感谢你花时间来帮助我。

信息

我目前正在使用CodeIgniter,如果它可能与你的答案有任何关系;)。

我在一个酒店网站上,想弄清楚如何预订房间。

我希望用户选择一个可用服务的列表,然后返回一个包含这些服务(全部)的房间列表,然后返回一个至少包含一个服务的列表。通过这种方式,我将向他们展示一份满足他们所有需求的房间清单,以及一间可能会奏效,但并不具备一切的房间。

这是我如何为我的房间存储我的服务(这可能是我的问题实际上…)

Table "services_rooms"
id_services_rooms | id_room | id_service
1                 | 1       | 1
2                 | 1       | 2
3                 | 1       | 3
5                 | 1       | 5
11                | 2       | 2
12                | 2       | 3
...               | ...     | ...

我怎么能做我的SQL要求我的服务器给我所有的房间,包含服务1,2和3,因此,只有我的"id_room" 1应该回来?

我试过做一些join/group_bys但我得到的最多的是例如,3行返回说:

Return rows :
ID_ROOM 1 | ID_SERVICE 1
ID_ROOM 1 | ID_SERVICE 2
ID_ROOM 1 | ID_SERVICE 3

另一种看待它的方式是这样的:我想问我的服务器哪些房间包含所有这些服务:1,2,3

它会回答:ID_ROOM 1.

我看到了一些关于合并之类的问题,但他们的答案不能完全应用到我的问题上。

再次感谢。

这叫做关系划分

SELECT id_room
FROM services_rooms
WHERE id_service IN (1,2,3)
GROUP BY id_room
HAVING COUNT(*) = 3
    <
  • SQLFiddle演示/gh>

如果id_service对每个id_room没有强制惟一约束,则DISTINCT是必需的。

SELECT id_room
FROM services_rooms
WHERE id_service IN (1,2,3)
GROUP BY id_room
HAVING COUNT(DISTINCT id_service) = 3

您的问题的答案返回至少有一种服务的所有房间。查询是:

SELECT id_room, count(*) as NumServices
FROM services_rooms
WHERE id_service IN (1,2,3)
GROUP BY id_room
HAVING COUNT(*) > 0
order by count(*) desc