如何显示一个表中的记录,其中输出记录的数量取决于另一个表

时间:2015-03-18 21:30:29

标签: mysql sql

车辆

     +--------+--------+-----------+
     | regNo  |  make  |   model   |
     +------- +--------+-----------+
     | SM56ED |  BMW   | 3 Series  |
     +--------+--------+-----------+
     | GH45EM |  Audi  |    A3     |
     +--------+--------+-----------+
     | LM33ZG | Toyota |   Yaris   |
     +--------+--------+-----------+
     | ZR88HH | Suzuki |   Swift   |
     +--------+--------+-----------+

预订

     +----+---------+------------+------------+
     | id |  regNo  | date_from  |  date_to   |
     +----+---------+------------+------------+
     | 1  | SM56ED  | 2015-03-20 | 2015-04-10 |
     +----+---------+------------+------------+
     | 2  | LM33ZG  | 2015-05-15 | 2015-05-22 |
     +----+---------+------------+------------+

所以我想说我有这两张桌子。我想检查另外两个日期,让我们说:

    from: '2015-03-25' 
    to: '2015-04-05'

我想显示每个汽车品牌,没有预订的型号或预订不在指定日期之间。因此,上面的示例应该显示奥迪,丰田和铃木,而不是宝马,因为在指定的车辆日期之间预订。

我试图使用'WHERE NOT EXISTS',内部检查是否在日期中传递'BETWEEN''date_from'和'date_to'。然而,如果没有预订车辆,这将返回所有车辆,或者如果在日期之间预订至少一辆车,则返回0辆车。

感谢您的任何建议,谢谢。

2 个答案:

答案 0 :(得分:0)

我没有数据库可以在ATM上对此进行测试,但是这样的连接怎么样:

select * from Vehicle v left join Booking b on v.regNo = b.regNo where b.id is null or (b.date_from > '2015-03-25' and b.date_to < '2015-04-05')

答案 1 :(得分:0)

您必须将not exists部分中的查询与外部查询相关联(例如,进行相关查询):

select * from Vehicle v
where not exists (
    select 1 from Booking 
    where regNo = v.regNo
      and date_from <= '2015-04-05'
      and date_to   >= '2015-03-25' 
    )

基于exists谓词构建的查询通常是最快的解决方案。