1

わかりました私は本当に立ち往生しています。次のように3つのテーブルがあります。

テーブルコントラクト

contract_id  |  hotel_id  |  start    |    end
---------------------------------------------------
    1              356     2012-12-12   2012-12-16   
    2              258     2012-12-12   2012-12-16   
    3              211     2012-12-12   2012-12-16   

テーブルhotel_info

hotel_id  |  hotel_desc
------------------------------
   356           description 1
   258           description 2
   211           description 3

テーブル料金

contract_id  |  hotel_id  |  book_date  |   rate   |   closed  
--------------------------------------------------------------
     1            258       2012-12-12     250.00        1
     1            258       2012-12-13     250.00        0
     1            258       2012-12-14     250.00        1
     1            258       2012-12-15     250.00        1

今私がやろうとしているのは、ユーザーが入力する特定の日付範囲の間の契約テーブルからすべての行を取得することです。ご覧のとおり、レート表は個々の日付ごとに区切られています。行に関連付けられたレートが 0 の場合、行を取得したくありません。たとえば、2012-12-14 と 2012-12-15 の間の日付のレートを取得したい場合、結果が得られます。しかし、2012-12-12 から 2012-12-14 を検索しても、結果が得られません。これが非常に紛らわしいかどうかはわかりませんが、これまでのところ動作していないmysqlがあります:

SELECT r.*, c.* FROM contracts AS c
INNER JOIN hotel_info AS r ON r.hotel_id = c.hotel_id
INNER JOIN rates AS ra ON ra.contract_id = c.contract_id AND ra.closed != 0
WHERE c.start <= '2012-12-12' AND c.end >= '2012-12-16' GROUP BY r.room_name

これについての助けをいただければ幸いです!何か不足している場合はお知らせください。よろしくお願いします!

4

1 に答える 1

2

私がこれを正しく理解している場合、契約に指定された日付範囲内の関連する料金レコードの範囲が 1 の場合にのみデータを返したいと考えてNOT EXISTSいます。

SELECT r.*, c.* FROM contracts AS c
    INNER JOIN hotel_info AS r ON r.hotel_id = c.hotel_id
    INNER JOIN rates AS ra ON ra.contract_id = c.contract_id AND ra.closed != 0
WHERE c.start >= '2012-12-12' AND c.end <= '2012-12-16' 
    AND NOT EXISTS 
     (
         SELECT
             1
         FROM rates ira 
         WHERE ira.contract_id = ra.contract_id
             AND ira.rate = 0
     )
GROUP BY r.room_name
于 2012-11-13T04:46:12.687 に答える