如何加入不应存在列的表或查询值不应该在日期之间?

时间:2017-01-24 20:59:02

标签: mysql join

我知道我的头衔并不是最好的。 我试图完成的是:

我有4张桌子:

  • Parking_Spots
  • 地址
  • 状况
  • 预订

我的查询有3个参数:

  • 邮政编码
  • from(期望的开始日期(时间))
  • 到(期望的结束日期(时间))

首先我们过滤停车场

INNER JOIN `deb93093_api`.`Addresses`
    ON (
      `deb93093_api`.`Parking_Spots`.`address` = `Addresses`.`uuid`
    )

===

WHERE (`Addresses`.`zipCode` = '4651AA')

然后是可用的停车场

INNER JOIN `deb93093_api`.`Availability`
    ON (
      `Availability`.`parkingSpot` = `Parking_Spots`.`uuid`
    )

===

AND (
     '2016-12-31' BETWEEN `Availability`.`fromDate` AND `Availability`.`toDate`
  )
AND (
    '2016-12-31' BETWEEN `Availability`.`fromDate` AND `Availability`.`toDate`
  )

但问题出在这里:

我需要在预定的时间内预订尚未预订的停车场

-- AND (
 --   '2016-12-31' NOT BETWEEN `Bookings`.`from` AND `Availability`.`to`
 -- )

 -- AND (
 --   '2016-12-31' NOT BETWEEN `Bookings`.`from` AND `Availability`.`to`
 -- )

但内部联接只是试图显示有记录的停车位。然而,他们应该展示没有预订的那些。我可以使用哪种类型的联接?我想选择可用的停车场,这是

available = parkingspots_with_right_zipcode - 只有可用的 - 已设置为所有者可用但已预订的

到目前为止的完整查询:

SELECT
  `Parking_Spots`.*
FROM
  `deb93093_api`.`Parking_Spots`

  INNER JOIN `deb93093_api`.`Addresses`
    ON (
      `deb93093_api`.`Parking_Spots`.`address` = `Addresses`.`uuid`
    )
  INNER JOIN `deb93093_api`.`Availability`
    ON (
      `Availability`.`parkingSpot` = `Parking_Spots`.`uuid`
    )

  OUTER JOIN `deb93093_api`.`Bookings`
   ON (
     `Bookings`.`parkingSpot` = `Parking_Spots`.`uuid`
   )



 WHERE (`Addresses`.`zipCode` = '4651AA')
  AND (
     '2016-12-31' BETWEEN `Availability`.`fromDate` AND `Availability`.`toDate`
  )
  AND (
    '2016-12-31' BETWEEN `Availability`.`fromDate` AND `Availability`.`toDate`
  )

 -- AND (
 --   '2016-12-31' NOT BETWEEN `Bookings`.`from` AND `Availability`.`to`
 -- )

 -- AND (
 --   '2016-12-31' NOT BETWEEN `Bookings`.`from` AND `Availability`.`to`
 -- )

enter image description here

来回预订,所以我想过滤那些已经预订了所需时间的人。但是,如果预订中没有该停车场的记录,它仍应显示停车场,因为它没有预订(如此可用)

PSEUDE代码进一步澄清

 (
AND (
WHERE $desired_from NOT BETWEEN Bookings`.`from` AND `Bookings`.`to` )

  AND (
    $desired_to NOT BETWEEN `Bookings`.`from` AND `Bookings`.`to`
  )
OR
WHERE [there is no record in Bookings]

1 个答案:

答案 0 :(得分:2)

在这种情况下,您可以在LEFT JOIN子句中使用ON附加条件,然后仅过滤未找到连接记录的行:

SELECT
  `Parking_Spots`.*
FROM
  `deb93093_api`.`Parking_Spots`

  INNER JOIN `deb93093_api`.`Addresses`
    ON (
      `deb93093_api`.`Parking_Spots`.`address` = `Addresses`.`uuid`
    )
  INNER JOIN `deb93093_api`.`Availability`
    ON (
      `Availability`.`parkingSpot` = `Parking_Spots`.`uuid`
    )

  LEFT JOIN `deb93093_api`.`Bookings`
   ON (
     `Bookings`.`parkingSpot` = `Parking_Spots`.`uuid`
   ) 
   AND (
     '2016-12-31' BETWEEN `Bookings`.`from` AND `Bookings`.`to`
   )

 WHERE (`Addresses`.`zipCode` = '4651AA')
  AND (
     '2016-12-31' BETWEEN `Availability`.`fromDate` AND `Availability`.`toDate`
  )
  AND `Bookings`.`uuid` IS NULL -- THIS MEANS THE SPOT IS NOT BOOKED