MySQL-存在Where关系添加Where,如果不存在则忽略Where
我有一张航班表和一张预订表 航班有一列,MySQL-存在Where关系添加Where,如果不存在则忽略Where,mysql,sql,Mysql,Sql,我有一张航班表和一张预订表 航班有一列,max_乘客 航班通过参考航班id的预订表进行预订 我在laravel/PHP中使用了它,但我正在寻找实际SQL的帮助,因为它让我有点发疯。我现在可以查询航班,并通过使用sum(bookings.places\u booked)计算出剩余的免费座位数,然后从max\u passengers中提取这个数字,但我如何编写SQL,它可以: 随机选择航班 如果预订与本次航班相对应,则将预订的座位数量相加,并添加一个where
max_乘客
航班通过参考航班id的预订表进行预订
我在laravel/PHP中使用了它,但我正在寻找实际SQL的帮助,因为它让我有点发疯。我现在可以查询航班,并通过使用sum(bookings.places\u booked)
计算出剩余的免费座位数,然后从max\u passengers
中提取这个数字,但我如何编写SQL,它可以:
- 随机选择航班
- 如果预订与本次航班相对应,则将预订的座位数量相加,并添加一个where
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
选择航班、预订*
从航班
LEFT JOIN bookings ON flights.id=bookings.flight\u id
其中总(预订量、预订地点)
这正是我试图实现的目标,但正如我所说的,我不知道如何使join/where成为可选的,因此在不存在关系的情况下,检查并不重要
编辑(最终SQL):
选择航班、预订*
从航班
LEFT JOIN bookings ON flights.id=bookings.flight\u id
按航班分组
合并(总(预订量、预订地点)0)
两件事:1)对于聚合函数,应该使用
HAVING
子句,而不是WHERE
子句(您的查询应该抛出错误)
2) 使用COALESCE()
将值从NULL
替换为实际值。这是查询不起作用的第二个原因。当不存在匹配项时,bookings.places\u booked
为空,则条件呈现为null
,这将始终为假
GROUP BY flights.id
HAVING COALESCE(sum(bookings.places_booked),0) < MAX(flights.max_passengers)
ORDER BY flights.id
GROUP BY flights.id
合并(总(预订量、预订地点)0)
GROUP BY flights.id
HAVING COALESCE(sum(bookings.places_booked),0) < MAX(flights.max_passengers)
ORDER BY flights.id