Оператор SQL выбирает только те элементы, которые отображаются менее двух раз - PullRequest
0 голосов
/ 23 марта 2012

В настоящее время я работаю над базой данных, в которой хранится информация, позволяющая пользователям бронировать столик в ресторане.

Я пытаюсь создать оператор 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 голосов
/ 23 марта 2012
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

Я предпочитаю первое, потому что оно чище, яснее и его легче расширять, несмотря на выбор.

0 голосов
/ 23 марта 2012

Если единственное, что вас волнует, это возвращать reservation.a_time s, которые появляются ТОЧНО один раз, то это будет сделано:

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

Это сгруппирует все RESERVATION записи по времени и вернет толькогруппы с одним участником.

...