2

私のSQLはそれほど良くないので、ご容赦ください。

3 つの異なるテーブルの情報を考慮したクエリを作成したいと考えています。

状況を説明しましょう: 顧客が部屋を予約するとき、彼らは複数の部屋を希望しており、部屋は別々の日に予約することができます (1 日に 1 つの一意の予約を行う必要があります)。

ここで、特定の時間に部屋が利用可能かどうかを確認するクエリを書きたいと思います。これらは、データベースにあるテーブルです

部屋

このテーブルには、各部屋に関する情報が格納されます

Fields:

id (primary key)
capacity    
img 
notes   
building_id 
roomstructure_id    
lecturestyle_id

リクエスト

このテーブルには、行われた各リクエストに関するメッセージが格納されます

Fields

id (primary key)
day_id
period_id
preference_id (foreign key from preference.id)

このテーブルには、行われた各リクエストに関する情報が格納されます。

好み

このテーブルには、すべての部屋の設定に関する情報が格納されます。

id (PK)      
request_id (foreign key from request.id)      
room_id (foreign key from room.id)

私がやろうとしていることが明らかになったことを願っています。

たとえば、部屋 C233 が月曜日の 09:00 に予約されているかどうかを確認している場合、部屋のテーブルで部屋の情報を検索優先テーブルのroom_idを使用してrequest_idを検索する必要があります。

特定の部屋 (部屋設定テーブル内) にリンクされているrequest_idを取得したら、リクエストテーブルで day_id=1 および period_id=1 かどうかを確認できます。day_id=1 かつ period_id=1 の場合、部屋が月曜日の 09:00 に予約されていることを意味します。

これは、部屋が利用できないためカウントされないことを意味しますが、この行が見つからない場合はカウントされます。

これは私がこれまでに書いた SQL です。非常に単純ですが、私がやりたいことすべてを実行するわけではありません。

SELECT COUNT(*) totalCount FROM ts_room

これに加えて、別のフォーラム (このコードはこちら) でアドバイスを提供されました。しかし、それはまったく機能しません。私はそれが私の基準を満たしていないと思います:

SELECT  COUNT(*) totalCount
FROM    room a
        INNER JOIN preference b
            ON a.id = b.room_id
        INNER JOIN ts_request c
            ON b.request_id = c.preference_id
WHERE   c.day_id = 1 AND c.period_id = 1

前もって感謝します!

4

1 に答える 1

0

OK、投稿したコードはほぼ正しいですが、いくつか問題があります。まず、リクエスト テーブルの名前に矛盾があります。説明では「リクエスト」と呼んでいますが、コードでは「ts_request」です。ただし、質問のタイプミスかもしれません。

もう 1 つの問題は、2 番目の INNER JOIN (設定と要求の間) のキーが混同されていることです。あなたは b.request_id = c.preference_id を持っています。IE: 2 つの外部キーを、それらが表す主キーではなく、互いに一致させようとしています。結合を行うために必要なのは、主キーと外部キーのペアが 1 つだけです。したがって、これは機能するはずです(テストされていません):

SELECT  COUNT(*) totalCount
FROM    room a
        INNER JOIN preference b
            ON a.id = b.room_id
        INNER JOIN request c
            ON b.request_id = c.id
WHERE   c.day_id = 1 AND c.period_id = 1

(私は完全に非記述的な識別子 a、b、および c を使用するのが好きではありませんが、それは有効なコードです。個人的には、少なくとも rm、rq、pf、またはそのような識別可能なものを使用します。または、とにかくかなり短いので、テーブル名。)

注意すべきことの 1 つは、リクエスト テーブルとプリファレンス テーブルからの両方向に外部キーがあるということは、リクエストごとに 1 つのプリファレンスがあることを意味するということです。(または、リクエスト テーブルのpreference_id フィールドを空白/null のままにしておくことができる場合はゼロになる可能性があります。) リクエストごとに複数の設定を送信できるようにする場合は、preference_id 外部キー列を削除する必要があります。ユニークな価値。上記のクエリにも必要ありませんが、実際にリクエストごとに 1 つの設定の制限がある場合は、別の場所で使用するためにそれを含めた可能性があります。

編集:質問のコメントで述べたように、このクエリも特定の部屋を探すのではなく、1 日目、期間 1 に予約された部屋の総数を返します。特定の部屋が必要な場合は、 「AND a.id =」をWHERE句に追加します。

于 2013-02-19T05:22:22.303 に答える