【问题标题】:MySQL Merging my selects togetherMySQL将我的选择合并在一起
【发布时间】:2012-12-13 21:17:44
【问题描述】:

感谢您抽出宝贵时间尝试帮助我。

信息

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

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

我已经看到其他几个关于合并等的问题,但不能完全将他们的答案应用于我的问题。

再次感谢。

【问题讨论】:

    标签: php mysql sql select


    【解决方案1】:

    这叫Relational Division.

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

    如果没有针对 ech id_roomid_service 强制执行唯一约束,则需要 DISTINCT

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

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • +1 用于返回问题询问包含这些服务(全部)的房间列表,然后是包含至少一个的列表。
      • 谢谢!使用其他查询中的设置,我能够想出和你一样的东西(>0):)
      猜你喜欢
      • 2015-06-16
      • 2020-01-23
      • 2011-10-01
      • 1970-01-01
      • 2019-12-02
      • 2012-03-20
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多