Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-存在Where关系添加Where,如果不存在则忽略Where_Mysql_Sql - Fatal编程技术网

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
我可以做到这一点,但如果没有针对航班进行预订,您如何做到这一点呢?加入/去哪里是可选的,不重要,因为最大乘客数就是免费座位的数量

我曾想过在flights表中添加一个
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