关于获取只需要数据的MySQL问题

时间:2011-03-10 00:05:20

标签: mysql

在我的数据库分析之前,我一直在问几个问题。我很感谢所有回复,这是另一个问题。

我正在尝试获取相互补充的路线数据和航空公司。意思是,两条路线共享一个节点:路线1的目的地机场是路线2的源机场。我只需使用WHERE子句就可以获得所有补充路由,但这是一个问题。我想找到相互补充的路线,但是路线2的目的地机场不应该是路线1的目的地机场之一。换句话说,航线服务路线1不应该自己到达路线2的目的地。

我有三张桌子:

姓名:补充
字段:route_id1,route_id2,airline_id1,airline_id2,source_airport,node_airport,destination_airport

名称:航空公司
fields:id(PK),name,iata_code

名称:路线
字段:id(PK),airline_id,source_airport,destination_airport

我认为需要这三个表才能为此要求创建查询。如果您需要更多表格信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

我不完全确定补码表的用途,所以我忽略了它。 (它实际上是否包含您已经需要的信息?或者您是否要将调查结果加载到该表中?)

鉴于路线列表,我相信以下查询将提供连续路线的列表,其第一个目的地是第二个来源,而不是由同一航空公司提供服务。子查询是关键 - 它将确保来自route1的航空公司没有到达路线2目的地的路线。

SELECT *
FROM routes route1 INNER JOIN routes route2
    ON route1.destination_airport=route2.source_airport
WHERE route1.airline_id<>route2.airline_id
    AND NOT EXISTS (
        SELECT * 
        FROM routes subqryRoutes
        WHERE subqryRoutes.airline_id=route1.airline_id
            AND subqryRoutes.destination_airport=route2.destination_airport
    )

免责声明:这是来自记忆,我还没有测试过。

答案 1 :(得分:0)

这是我的解决方案。我假设“航空公司”是指一架飞机,这是一架定期飞往多个机场的飞机。我将使用的唯一一张桌子叫做“PlanePorts”,它列出了航班和机场所在的机场。如果它是来源或目的地则无关紧要。

问题是这个(在我看来,可能不正确):确定一架飞机在另一条路线上与另一架飞机同一机场的路线。查找所有路线,使两架飞机只共享一个公共机场。如果你知道,那么你知道这两条路线相互补充而没有重叠。

通过这种方式,您可以找到彼此互补的所有路线。在现实世界中,你会添加时间的组成部分,看看飞机是否在一定的时间间隔内以正确的顺序到达,但这只是锦上添花,一旦主要部分得到解决,就会添加一些过滤器。

在示例中,我有三条路线:UA123转到DEN,MCO然后转到MSY SW456转到DAL,MSY然后转到SAN,因此它只与UA123重叠一次 F0000变为000,这只是无关的垃圾 AA121进入CHI,MSY和MCO,因此它与UA123重叠,但不止一次

在下面的查询中,我们发现只有SW456补充了UA123。

DROP TABLE PlanePort
CREATE TABLE PlanePort (
  id integer
, airline varchar(10)
, airport varchar(3)
) 

INSERT INTO PlanePort(id, airline, airport) VALUES ( 1, 'UA123','DEN');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 2, 'UA123','MSY');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 3, 'UA123','MCO');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 4, 'SW456','DAL');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 5, 'SW456','MSY');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 6, 'SW456','SAN');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 7, 'F0000','000');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 8, 'AA121','CHI');
INSERT INTO PlanePort(id, airline, airport) VALUES ( 9, 'AA121','MSY');
INSERT INTO PlanePort(id, airline, airport) VALUES (10, 'AA121','MCO');

SELECT * FROM PlanePort

-- find planes which go to the same place - this will be repeat each one twice
SELECT *
FROM PlanePort P1
INNER JOIN PlanePort P2
  ON P2.airport = P1.airport
 AND P2.airline != P1.airline
WHERE 1=1

-- how many of these flights above have one other route in common?
-- only get the flight with no others in common!
SELECT Flight1, Flight2, count(*)
FROM (
    SELECT P1.airline as Flight1, P1.Airport, P2.airline as Flight2
    FROM PlanePort P1
    INNER JOIN PlanePort P2
      ON P2.airport = P1.airport
     AND P2.airline != P1.airline
    WHERE 1=1
) as Q1
GROUP BY Q1.Flight1, Q1.Flight2
HAVING count(Q1.airport) < 2

干杯,

丹尼尔