Php MySQL查询返回web项目的匹配出港航班和回程航班

Php MySQL查询返回web项目的匹配出港航班和回程航班,php,mysql,Php,Mysql,我刚开始学习MySQL,从我的数据库中提取匹配航班时遇到困难。我花了几天时间尝试不同的解决方案,但都无济于事!。我的数据库保存了虚拟的航班数据,其中出站航班和返程航班间隔为1周的倍数 我希望设计一个查询,检查是否存在,然后获取用户选择的起飞日期+/-3天内的出境和回程航班对。我需要通过出站航班订购航班,然后是匹配的返程航班,因为我将使用PHP的mysql_fetch_数组while循环输出结果 到目前为止,我一直在试验IF exist在WHERE子句中选择条件来检查出站航班是否存在,如果确实存在

我刚开始学习MySQL,从我的数据库中提取匹配航班时遇到困难。我花了几天时间尝试不同的解决方案,但都无济于事!。我的数据库保存了虚拟的航班数据,其中出站航班和返程航班间隔为1周的倍数

我希望设计一个查询,检查是否存在,然后获取用户选择的起飞日期+/-3天内的出境和回程航班对。我需要通过出站航班订购航班,然后是匹配的返程航班,因为我将使用PHP的mysql_fetch_数组while循环输出结果

到目前为止,我一直在试验IF exist在WHERE子句中选择条件来检查出站航班是否存在,如果确实存在,则返回出站航班和返回航班。这在测试一个日期时可以正常工作,但我不确定如何将它集成到一个日期范围中,除非我可以在mysql中使用while循环?我也读过,在WHERE子句中使用IF语句并不理想,因为它会增加查询时间

通过在用户表单中添加“持续时间”选项(即1周、2周等)到过期日期,以PHP计算返回日期

我已经复制了下面的查询代码,但我知道可能有更简单/更好的方法来实现我想要的结果,如果有任何指导,我将不胜感激。我的代码将只返回提供给它的特定日期的匹配航班对,因为我不确定如何实施+/-3天搜索,并将结果按出站航班对和返回航班对的顺序保存

谢谢, 加里


这可能对你有帮助。这是一个新的解决方案,应该能解决你的问题。我没有包括您查询中的大量连接,但是添加它们很简单。为了使+/-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