2012-03-22 7 views
1

こんにちは私は、ユーザーがレストランを予約できるデータベースを作成しています。以下は、私のデータベースのデータモデルです。SQLによるデータベースチェック予約

私の質問は、私はちょっと混乱して、どのように私は特定の夜に利用可能なテーブルをチェックするだろうと思います。レストランには、夜間に15人のテーブルがあり、テーブルには4人がいます(グループは4〜6人、グループが4人以上の人は2人のテーブルを取る)。

どのように私はデータベースを特定の夜に利用可能なテーブルを返すように問い合わせるでしょう。

ありがとうございました。

編集:

これは私が試みたものです。それは、テーブルのなし存在をチェックされるように、これはよく空の行を返す

SELECT tables.table_id 
FROM tables 
LEFT JOIN table_allocation 
ON tables.table_id = table_allocation.table_id 
WHERE table_allocation.table_id is NULL; 

(私はそれを行う方法は非常に確認していないとして、それのいくつかは擬似です)。私はどのように私は日付のビットテストを行うだろうか分からない。平易な英語で

SELECT * 
FROM TABLES 
WHERE 
    TABLE_ID NOT IN (
     SELECT TABLE_ALLOCATION.TABLE_ID 
     FROM 
      TABLE_ALLOCATION 
      JOIN RESERVATION 
       ON TABLE_ALLOCATION.RESERVATION_ID = RESERVATION.RESERVATION_ID 
      JOIN THEMED_NIGHT 
       ON RESERVATION.THEME_ID = THEMED_NIGHT.THEME_ID 
     WHERE 
      THEME_NIGHT_NAME = :the_date 
    ) 

+2

http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

答えて

3

与えTHEMED_NIGHT.TEME_NIGHT_DATEに TABLE_ALLOCATION行を持たないテーブルの行を見つけるには、このような何かを行うことができるはず

  • が参加しますTABLE_ALLOCATION、RESERVATION、およびTHEMED_NIGHTを指定し、指定された日付にあるもののみを受け入れます(:the_date)。
  • 上記のタプルに関連するTABLE行を破棄します(NOT IN)。
  • 残っているTABLE行は、夜間は無料です。
+0

これはテーマの夜に予約されているテーブルのみを除外します - THEMED_NIGHTの点線はこれがオプションであることを意味します関係。 –

+0

@ MarkBannister Ahh ...私は完全にRESERVATION.TIMEを逃した。とにかく、あなたの答えは私の+1 :) –

1

試してみてください。

SELECT tables.table_id 
FROM tables t 
WHERE NOT EXISTS 
(SELECT NULL 
FROM table_allocation a 
JOIN reservation r 
    ON a.reservation_id = r.reservation_id and 
     r.`TIME` between :Date and :Date+1 
WHERE t.table_id = a.table_id) 

注:のみ、当該日の任意の時点で計上されていないテーブルを返します。