检查结果集中是否存在一组键

时间:2013-08-28 02:35:03

标签: mysql sql

在简化的租赁系统中,有三种关系:

  • 书籍:id,title,description
  • 复制:id,book_id
  • 预订:id,copy_id,rent_from,rent_until

每本书都有很多副本。如果客户租借图书,则会选择可用的副本并创建相应的预订记录。

现在我的问题:客户选择一本书,他/她想租。系统需要检查,在给定的租赁期内可以使用哪些副本。

查询可用副本的最优雅,最快捷的方式是什么?

基本上,一步一步将执行以下操作:

  1. 选择相应图书的所有副本
  2. 选择指定期间内的所有预订
  3. 检查所选预订中未包含该书的哪些副本。如果包含所有副本,则该书在指定期间内不可出租
  4. 第3步令我头疼。如何在SQL中执行此操作?我是否可以在一个优雅的查询中执行所有三个步骤?

1 个答案:

答案 0 :(得分:2)

假设你有bookid。您正在寻找:

select c.*
from copies c
where not exists (select 1
                  from booking b
                  where b.copy_id = c.id and
                        b.rent_until >= @PeriodStart and b.rent_from <= @PeriodEnd
                 );

这是检查重叠时间段。如果预订在期间开始后结束并且预订在期间结束之前开始,则会有重叠。比较可能是<>,具体取决于是否可以在rent_until日期租借图书,或者是否必须等到第二天。