查询联接并计数来自多个表的某些数据-mysql

时间:2019-02-02 02:54:04

标签: mysql sql join

我希望在给定的日期时间范围内获得:

  • 机场名称
  • 该机场的航班数(该机场到达的次数飞行中的飞机,而同一航班的出发日期在给定的日期时间范围内),
  • 该机场的已售票数量(dateOfSale必须在给定的日期时间范围内)和
  • 该机场售出机票的总价。

我有3张桌子(机场,航班和机票):

Airport data:
    id | name
    1  , Madrid Airport
    2  , Amsterdam Airport
    3  , Belgrade Airport
----------------------------------------------
Flight data:
    id | number |   departureDate   |    arrivalDate    |  departureAirport  |  arrivalAirport  | price
    1  , 101    ,2019-01-29 19:21:44,2019-01-29 22:21:44,  Madrid Airport    , Amsterdam Airport, 600
    2  , 102    ,2019-01-29 22:21:44,2019-01-30 00:21:44,  Madrid Airport    , Belgrade Airport , 450
    3  , 103    ,2019-01-30 20:21:44,2019-01-30 22:21:44,  Belgrade Airport  , Amsterdam Airport, 555
    4  , 104    ,2019-02-10 20:21:44,2019-02-10 22:21:44,  Belgrade Airport  , Madrid Airport   , 555
----------------------------------------------
Ticket data:
    id | FlightId | dateOfSale
    1  , 3        , 2019-01-23 00:00:00
    2  , 3        , 2019-01-27 10:00:00
    3  , 1        , 2019-01-27 13:00:00

日期时间范围示例:

  • 最小:2019-01-25 19:21:44

  • 最大值:2019-02-02 00:00:00

在给定的日期时间范围内,只有第四个航班不会通过条件,因为其DateDate不在给定的范围内,其他三个航班都将通过。

现在,我们有阿姆斯特丹机场(x2)和贝尔格莱德机场(x1)作为到达机场。 所以前两列应该这样表示:

Name of Airport  | Number of Flights | 
Amsterdam Airport, 2
Belgrade Airport , 1

第三张代表售出的门票数量,而dateOfSale也在指定的日期时间范围内。

在机票表中出售了3张机票,购买了前两张ID = 3的航班,购买了第三张ID = 1的航班。 由于第一张机票的dateOfSale不在指定的日期时间范围内,因此只有第二张和第三张机票会通过,并且它们都代表称为阿姆斯特丹机场的到达机场。

所以最终结果应该是:

Name of Airport  | Number of Flights | Number of sold tickets | Total price
Amsterdam Airport, 2                 , 2                      , 1155
Belgrade Airport , 1                 , 0                      , 0 

我尝试过这样的事情:

select a.name, count(f.arrivalAirport) as 'number of flights', 
count(t.dateOfSale) as 'number of sold tickets', sum(f.price) from airport a, 
flight f, ticket t where a.name = f.arrivalAirport and f.departureDate > 
'2019-01-25 19:21:44' and f.departureDate < '2019-02-02 00:00:00' and 
t.flightId = f.id and t.dateOfSale > '2019-01-25 19:21:44' and t.dateOfSale 
< '2019-02-02 00:00:00' group by a.name;

仅执行此操作,它便会完全计数应该售出的机票数,但航班数是错误的。

我不确定如何继续进行。我在此查询中缺少什么,可以这样做吗?还是必须包含join(我也遇到问题)?

0 个答案:

没有答案