2012-03-23 2 views
0

現在、私は現在、ユーザーがレストランで予約を行うことができる情報を格納するデータベースを作成しています。SQLステートメントは、2度未満で表示されるアイテムのみを選択します

私は、予約テーブルに2回以下表示される時刻を返すSQL文を作成しようとしています。

私はこれを持っていますが、これは予約テーブルには表示されない時間だけを返します。

SELECT * 
FROM TIME 
WHERE 
    TIME NOT IN (
     SELECT reservation.a_time 
     FROM 
      RESERVATION 
     JOIN TIME ON 
      reservation.a_time = time.time 
     WHERE 
      reservation.a_date = :the_date 
    ) 
ORDER BY time; 

上記のステートメントは、予約テーブルにないすべての時間を返します。しかし、どのように私は一度表示されるそれらを含む予約テーブルに表示されるすべての回を返すだろうが、2回現れるものではない?

おかげ

答えて

3
select 
    * 
from 
    TIME t 
where 
    (select 
    count(r.a_time) 
    from 
    RESERVATION r 
    where 
    r.a_time = t.time and 
    r.a_date = :the_date) < 2 

または

select 
    t.time /* and maybe other field, which you need to add to Group By as well */ 
from 
    TIME t 
    left join RESERVATION r on r.a_time = t.time and r.a_date = :the_date 
group by 
    t.time 
having 
    count(t.time) < 2 

それは、クリーナーより明確であり、副選択にもかかわらず、容易に拡張することができますので、私は、最初のを好みます。

-1

あなたは正確に一度現れるreservation.a_time秒を返している気に唯一のものは、これはそれを行います場合は、次の

SELECT reservation.a_time 
FROM RESERVATION 
GROUP BY reservation.a_time 
HAVING COUNT(*) = 1; 

この意志グループ時間ですべてRESERVATIONエントリ、のみリターングループにはちょうど1人のメンバーがいます。

+0

予約していない時間は返されません。 – GolezTrol

+0

@GolezTrol彼は特に予約テーブルに表示されるすべての時間を要求するので、彼の質問は不思議に言われます。 – ean5533

関連する問題