MySQL - 存在关系的地方添加一个地方,如果不存在则忽略

时间:2017-09-06 08:15:03

标签: mysql sql

我有一张航班表和一张预订表。

航班有一列max_passengers

航班在预订表中引用了flight_id

我在laravel / PHP中使用它但是我正在寻找实际SQL的帮助,因为它让我有点循环我现在可以查询航班并计算出使用sum(bookings.places_booked)剩下的免费地点数量从max_passengers中总结这个数字,但我怎么能编写那样做的SQL:

  • 随机选择航班
  • 如果预订违反此航班的总和,则预订的地点数量将增加一个< max_passengers

我可以做到这一部分,但如果没有针对航班进行预订,你怎么能这样做呢?加入/哪里变成可选的并且无关紧要因为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

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