请考虑以下两个表:
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中以某种方式做到这一点。
答案 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;
然后您可以使用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;
您会注意到我使用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