2013-02-10 3 views
3

Пожалуйста, обратите внимание на следующие две таблицы:SQL максимальное количество записей с общим значением

Holidays 
HolidayID (PK) 
Destination 
Length 
MaximumNumber 
... 


Bookings 
BookingID (PK) 
HolidayID (FK) 
Name 
... 

Клиенты могут заказать праздники (например, поехать на Гавайи). Но предположим, что данный праздник имеет максимальное количество мест. например в этом году на Гавайях всего 75 каникул (игнорируя другие годы).

Так что, если какой-либо клиент хочет забронировать отпуск на Гавайях. Мне нужно подсчитать записи в таблице «Бронирование», и если это число больше 75, я должен сказать клиенту, что уже слишком поздно. Это может быть сделано с использованием 2 запросов MySQL (1 для получения MaximumNumber для праздника, 2 для получения текущей суммы из книг) и PHP (например) для сравнения значения счета с максимальным количеством праздников Гавайев. Но я хочу знать, есть ли способ сделать это чисто в SQL (MySQL в этом случае)? т. е. подсчитать количество заказов на Гавайи и сравнить их с максимальным значением Гавайских островов.

EDIT: Мой метод:

$query1 = "SELECT MaximumNumber FROM Holidays WHERE HolidayID=$hawaiiID"; 

$query2 = "SELECT COUNT(BookingID) FROM Bookings WHERE HolidayID=$hawaiiID"; 

Таким образом, если первый запрос дает 75, а второй запрос дает 75 Я могу сравнить эти значения в PHP. Но я задавался вопросом, есть ли способ сделать это как-то только в SQL.

+0

лучше откажитесь: 1-то, что вы пробовали, 2- простых данных, 3 желанную выход, 4 - sqlfiddle если возможно, 5-напишите свой код в формате 6, .... ...... 10- мы можем помочь вам –

ответ

0

Может быть, я что-то не хватает, но почему бы не использовать подзапрос, чтобы определить общее количество заказов для каждого holidayid:

select * 
from holidays h 
left join 
(
    select count(*) TotalBooked, HolidayId 
    from bookings 
    group by holidayId 
) b 
    on h.holidayId = b.holidayId 
WHERE h.HolidayID=$hawaiiID; 

См SQL Fiddle with Demo.

Тогда вы могли бы использовать выражение CASE для сравнения TotalBooked к MaxNumber похожее на это:

select h.destination, 
    case 
    when b.totalbooked = h.maxNumber 
    then 'Not Available' 
    else 'You can still book' end Availability 
from holidays h 
left join 
(
    select count(*) TotalBooked, HolidayId 
    from bookings 
    group by holidayId 
) b 
    on h.holidayId = b.holidayId 
WHERE h.HolidayID=$hawaiiID; 

См SQL Fiddle with Demo.

Вы заметили, что я использовал LEFT JOIN, который будет возвращать все строки из таблицы Holidays, даже если в таблице Bookings нет соответствующих строк.

0

Что-то вроде этого будет работать. Вы можете заполнить в деталях:

select case 
when 
(select count(*) 
from Bookings 
where holidayID = $hawaiiid) 
<= MaximumNumber then 'available' else 'sold out' end status 
from holidays 
etc 
0

Вы могли бы попробовать что-то вроде этого:

select case when b.freq < h.MaximumNumber 
      then 'Available' 
      else 'Not Available' 
      end as MyResult 
from Holidays h 
left join (
    select HolidayID 
     , count(*) as freq 
    from Bookings 
    where HolidayID=$hawaiiID 
    group by HolidayID 
    ) b 
on h.HolidayID=b.HolidayID 
Смежные вопросы