Php MySQL查询返回web项目的匹配出港航班和回程航班
我刚开始学习MySQL,从我的数据库中提取匹配航班时遇到困难。我花了几天时间尝试不同的解决方案,但都无济于事!。我的数据库保存了虚拟的航班数据,其中出站航班和返程航班间隔为1周的倍数 我希望设计一个查询,检查是否存在,然后获取用户选择的起飞日期+/-3天内的出境和回程航班对。我需要通过出站航班订购航班,然后是匹配的返程航班,因为我将使用PHP的mysql_fetch_数组while循环输出结果 到目前为止,我一直在试验IF exist在WHERE子句中选择条件来检查出站航班是否存在,如果确实存在,则返回出站航班和返回航班。这在测试一个日期时可以正常工作,但我不确定如何将它集成到一个日期范围中,除非我可以在mysql中使用while循环?我也读过,在WHERE子句中使用IF语句并不理想,因为它会增加查询时间 通过在用户表单中添加“持续时间”选项(即1周、2周等)到过期日期,以PHP计算返回日期 我已经复制了下面的查询代码,但我知道可能有更简单/更好的方法来实现我想要的结果,如果有任何指导,我将不胜感激。我的代码将只返回提供给它的特定日期的匹配航班对,因为我不确定如何实施+/-3天搜索,并将结果按出站航班对和返回航班对的顺序保存 谢谢, 加里Php MySQL查询返回web项目的匹配出港航班和回程航班,php,mysql,Php,Mysql,我刚开始学习MySQL,从我的数据库中提取匹配航班时遇到困难。我花了几天时间尝试不同的解决方案,但都无济于事!。我的数据库保存了虚拟的航班数据,其中出站航班和返程航班间隔为1周的倍数 我希望设计一个查询,检查是否存在,然后获取用户选择的起飞日期+/-3天内的出境和回程航班对。我需要通过出站航班订购航班,然后是匹配的返程航班,因为我将使用PHP的mysql_fetch_数组while循环输出结果 到目前为止,我一直在试验IF exist在WHERE子句中选择条件来检查出站航班是否存在,如果确实存在
这可能对你有帮助。这是一个新的解决方案,应该能解决你的问题。我没有包括您查询中的大量连接,但是添加它们很简单。为了使+/-3天部分工作,我假设您的dep_日期为TIMESTAMP类型,您的$outdate和$return也为TIMESTAMP类型。ABS只是绝对值,即ABS-x=ABSx=x 使用MySQL的和函数或
这个问题需要图表。从你的提问中推断这一点并不有趣。巴斯蒂,非常感谢你在回答我的帖子时付出的所有努力!我没有想到要通过连接匹配出站和回程航班。用绝对值计算出+/-3天也是天才!我还没有实现它,因为我的航班在两个表上正常化,航班包含航班代码、出发和目的地机场以及航班时刻表,航班时刻表包含航班计划飞行的日期,两者都由航班id号连接,所以我必须坐下来找出合适的连接。再次感谢您的帮助!我的荣幸。如果有其他问题,请随时提问。我对你的小窍门:不要考虑表现,甚至不应该计算你的结果。SQL是一种声明性语言,这意味着您只需编写所需内容,而不必编写计算方式。如果您需要加入所有可能的航班组合,然后使用WHERE删除99%的航班组合,只需添加即可。无论如何,数据库服务器很可能会优化和重写您的查询。如果你有一个有效的查询,那就是你可以用来优化的时刻。但这只是一个警告:优化SQL查询是一项复杂的任务-
SELECT
sched.flight_schedule_id, dep_airport, dest_airport, code, dep_time, arr_time, flight_time, dep_date, dep.airport_name, dep.airport_country, adult_flight_price, dest.airport_name, dest.airport_country, plane.no_seats, sum(adult_seats_reserved), sum(child_seats_reserved)
FROM
flight fli
INNER JOIN flight_schedule sched
ON fli.flight_id = sched.flight_id
INNER JOIN airport dep
ON fli.dep_airport = dep.airport_code
INNER JOIN airport dest
ON fli.dest_airport = dest.airport_code
INNER JOIN plane_type plane
ON fli.plane_id = plane.plane_id
LEFT JOIN flight_inventory inv
ON sched.flight_schedule_id = inv.flight_schedule_id
WHERE
IF (EXISTS(SELECT
sched.flight_schedule_id, dep_airport, dest_airport, code, dep_time, arr_time, flight_time, dep_date, dep.airport_name, dep.airport_country, adult_flight_price, dest.airport_name, dest.airport_country
FROM
flight fli
INNER JOIN flight_schedule sched
ON fli.flight_id = sched.flight_id
INNER JOIN airport dep
ON fli.dep_airport = dep.airport_code
INNER JOIN airport dest
ON fli.dest_airport = dest.airport_code
LEFT JOIN flight_inventory inv
ON sched.flight_schedule_id = inv.flight_schedule_id
WHERE
dep.airport_name = '$to' AND dest.airport_name = '$from' AND sched.dep_date = '$return'),
(dep.airport_name = '$from' AND dest.airport_name = '$to' AND sched.dep_date = '$outdate')
OR
(dep.airport_name = '$to' AND dest.airport_name = '$from' AND sched.dep_date = '$return'), '')
GROUP BY
sched.flight_schedule_id
SELECT
*
FROM
flight_schedule outbound
JOIN
flight_schedule return
ON
/* return flights should depart from outbounds destination */
outbound.dest_airport = return.dep_airport
AND
/* optional. might reduce intermediate join result size */
outbound.arr_date < return.dep_date
WHERE
/* user wants to fly from airport $from to airport $to */
outbound.dep_airport = '$from'
AND outbound.dest_airport = '$to'
/* outbound flight should depart within 3 days before and after $outdate (3 days = 259200 seconds) */
AND ABS(outbound.dep_date - $outdate) < 259200
/* return flight should depart within 3 days before and after $return */
AND ABS(return.dep_date - $return) < 259200
ORDER BY
/* order outbound flights by distance to user's requested $outdate */
ABS(outbound.dep_date - $outdate) ASC,
/* and return flights by distance to user's requested $return date */
ABS(return.dep_date - $return) ASC
WHERE outbound.dep_date BETWEEN
DATE_SUB($outdate, INTERVAL 3 DAY)
AND DATE_ADD($outdate, INTERVAL 3 DAY)
WHERE
ABS(DATEDIFF(outbound.dep_date, $outdate)) < 259200
ORDER BY
ABS(DATEDIFF(outbound.dep_date, $outdate)) ASC,
ABS(DATEDIFF(return.dep_date, $return)) ASC