SQL具有公共值的最大记录数

时间:2013-02-10 15:12:28

标签: mysql sql

请考虑以下两个表:

Holidays
HolidayID (PK)
Destination
Length
MaximumNumber
...


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

客户可以预订假期(例如去夏威夷)。但是,假设某个假期有最大数量的地方。例如今年夏威夷只有75个假期(忽略其他年份)。

因此,如果某个客户想要预订夏威夷度假。我需要计算预订表中的记录,如果该数字大于75,我必须告诉客户为时已晚。 我可以使用2个MySQL查询(1个获取假期的MaximumNumber,2个来自预订的当前总数)和PHP(例如)来比较计数值和夏威夷假期的最大数量。 但是我想知道是否有一种方法可以在SQL中完成这个(在这种情况下是MySQL)?即计算夏威夷的预订数量,并与夏威夷的MaximumNumber值进行比较。

编辑: 我的方法:

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

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

因此,如果第一个查询给出75而第二​​个查询给出75,我可以在PHP中比较这些值。但我想知道是否有办法在SQL中以某种方式做到这一点。

3 个答案:

答案 0 :(得分:0)

也许我错过了什么,但为什么不使用子查询来确定每个假日的总预订量:

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表达式将TotalBookedMaxNumber进行比较,类似于:

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表中没有匹配的行也是如此。

答案 1 :(得分:0)

这样的东西会起作用。您可以填写详细信息:

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

答案 2 :(得分: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