我知道我的头衔并不是最好的。 我试图完成的是:
我有4张桌子:
我的查询有3个参数:
首先我们过滤停车场
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`
-- )
来回预订,所以我想过滤那些已经预订了所需时间的人。但是,如果预订中没有该停车场的记录,它仍应显示停车场,因为它没有预订(如此可用)
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]
答案 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