9

時間を割いて私を助けてくれてありがとう。

インフォメーション

あなたの答えに何か関係があるかもしれない場合、私は現在CodeIgniterを使用しています;)。

問題

ホテルのサイトで、部屋を予約する方法を見つけようとしています。

ユーザーが利用可能なサービスのリストを選択して、これらのサービスを含む部屋のリスト (すべて) に戻り、その後、少なくとも 1 つを含むリストに戻ります。このようにして、すべてのニーズを満たす部屋のリストと、うまくいくかもしれないがすべてを備えているわけではない部屋のリストを彼らに示します。

これが私の部屋のサービスを保存する方法です(実際にはここに私の問題があるかもしれません...)

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
...               | ...     | ...

サーバーにサービス1、2、3を含むすべての部屋を提供するようにSQLを実行するにはどうすればよいですか。したがって、「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 と答えます。

マージなどについて話している他のいくつかの質問を見てきましたが、それらの回答を私の問題に適用することはできませんでした。

再度、感謝します。

4

2 に答える 2

11

これを関係分割と呼びます。

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

id_serviceech に対して一意の制約が適用されていない場合はid_roomDISTINCT必須です。

SELECT id_room
FROM services_rooms
WHERE id_service IN (1,2,3)
GROUP BY id_room
HAVING COUNT(DISTINCT id_service) = 3
于 2012-12-28T16:14:22.743 に答える
7

あなたの質問に対する答えは、サービスの少なくとも 1 つを持つすべての部屋を返します。クエリは次のとおりです。

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
于 2012-12-28T16:26:20.880 に答える