我有一个复杂的SQL问题。我们正在建立一个租车系统。我们有一张汽车模型表,一张车主表和一张link_model_owner表。此外,我们的预订被放在另一张桌子上。
该计划如下:

现在,我需要一个查询来搜索所有可用的某种型号的汽车。我尝试了以下查询。但是,如果将一个linkId添加到预订数据库,并且那里的startDate和endDate为空,则此查询将提供多个结果。
我只想有一个唯一可用的链接is的列表,在那里汽车是不租出去的(现在()在startDate和endDate之间)。
请记住,预订数据库预计将增长1000's一天。
SELECT link_model_owner.id,
owners.fullName
FROM link_model_owner
LEFT JOIN bookings ON link_book_user.id = bookings.bookLinkId
INNER JOIN owners ON link_book_user.userId = owners.id
WHERE link_model_owner.isActive = '1'
AND link_model_owner.modelid = '252'
AND COALESCE(NOW() NOT BETWEEN bookings.startDate AND bookings.endDate, TRUE);发布于 2014-04-30 07:36:09
您想要使用所有表,特别是link_book_user,这还不太清楚,但我关注的是您的主要问题,考虑到startTime和endTime可能为null,您希望获得所有目前未被预订的汽车。
在下面的查询建议中,我过滤了已经在联接中链接的日期上的预订,然后查询就变得更容易构建了。如果预订的日期为空值,汽车将被视为免费的。
SELECT link_model_owner.id,
owners.fullName
FROM link_model_owner
LEFT JOIN bookings ON (link_model_owner.id = bookings.linkId
AND bookings.startDate <= now()
AND bookings.endDate >= now())
INNER JOIN owners ON owners.id = link_model_owner.ownerId
WHERE bookings.id IS null;注意:在startDate和endDate上有索引是很重要的,因为您的数据库将增长相当多(正如您所写的)。
https://dba.stackexchange.com/questions/64104
复制相似问题