MySQL合并我的选择

时间:2012-12-28 16:12:32

标签: php mysql sql select

并感谢您花时间尝试帮助我。

的信息

我目前正在使用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应该回来?

我尝试过做一些连接/ 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。

我已经看到了其他一些关于合并等问题的问题但却无法完全解决我的问题。

再次感谢。

2 个答案:

答案 0 :(得分:11)

这称为Relational Division.

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

如果id_service未对{4}强制执行唯一约束,则需要id_room

DISTINCT

答案 1 :(得分:7)

您问题的答案将返回至少包含其中一项服务的所有房间。查询是:

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