我有一张航班表和一张预订表。
航班有一列max_passengers
航班在预订表中引用了flight_id
我在laravel / PHP中使用它但是我正在寻找实际SQL的帮助,因为它让我有点循环我现在可以查询航班并计算出使用sum(bookings.places_booked)
剩下的免费地点数量从max_passengers
中总结这个数字,但我怎么能编写那样做的SQL:
我可以做到这一部分,但如果没有针对航班进行预订,你怎么能这样做呢?加入/哪里变成可选的并且无关紧要因为max_passengers将是免费地点的数量。
我曾考虑在航班表中添加free_places
列,但会出现当前设置避免的问题。
SELECT flights.*, bookings.*
FROM flights
LEFT JOIN bookings ON flights.id = bookings.flight_id
WHERE sum(bookings.places_booked) < flights.max_passengers
GROUP BY flights.id
ORDER BY flights.id ASC
这是我想要实现的目标,但正如我所说,我不知道如何使连接/在哪里可选,所以如果不存在关系,那么检查无关紧要。
编辑(最终SQL):
SELECT flights.*, bookings.*
FROM flights
LEFT JOIN bookings ON flights.id = bookings.flight_id
GROUP BY flights.id
HAVING COALESCE(sum(bookings.places_booked),0) < flights.max_passengers
ORDER BY RAND()
LIMIT 1
答案 0 :(得分:2)
两件事:1)你应该使用HAVING
子句而不是WHERE
子句用于聚合函数(你的查询应该抛出错误)。
2)使用COALESCE()
将NULL
中的值替换为实际值。这是您的查询无法正常工作的第二个原因。如果没有匹配项,bookings.places_booked
为空,则条件呈现为NULL < flights.max_passenger
,这将始终为false。
GROUP BY flights.id
HAVING COALESCE(sum(bookings.places_booked),0) < MAX(flights.max_passengers)
ORDER BY flights.id