繁体   English   中英

在MySQL中加入三个表进行报表

[英]Join three table for Report in Mysql

我想为使用以下信息的航空公司生成报告

  1. 日期表
  2. 航空公司表
  3. 路线表

我的日期表包括一系列日期

    Entryid | Date 
    ----------------
       1    |2016-06-01
       2    |2016-06-02
       4    |2016-06-03
       5    |2016-06-04
       6    |2016-06-05
       7    |2016-06-06

我的航班表包括

id|name
---------
1 |Air1
2 |Air2
3 |Air3

和路由表:

id|date     |airline|routename
1|2016-06-01|1      |city1-city2
2|2016-06-01|1      |city1-city3
3|2016-06-01|2      |city1-city3
4|2016-06-02|2      |city1-city3
5|2016-06-02|2      |city1-city3
6|2016-06-04|2      |city1-city3
7|2016-06-04|2      |city1-city3
8|2016-06-04|1      |city1-city3

通过使用这三个表,我想产生如下结果”

    Date   |Airline|totleroute
2016-06-01 |  Air1 | 2
2016-06-01 |  Air2 | 1
2016-06-02 |  Air1 | 0
2016-06-02 |  Air2 | 2
2016-06-03 |  Air1 | 0
2016-06-03 |  Air2 | 0
2016-06-04 |  Air1 | 1
2016-06-04 |  Air2 | 2

如何通过联接三个表产生期望的结果?

您可以使用如下查询:

SELECT d.`date`, t.`name`, COUNT(r.`routename`) AS TotalRoutes
FROM `Date` AS d
CROSS JOIN (
  SELECT DISTINCT r.`airline`, a.`name`
  FROM Route AS r 
  INNER JOIN Airline AS a ON r.airline = a.id
) AS t   
LEFT JOIN Route AS r ON d.`date` = r.`date` AND t.`airline` = r.`airline`
GROUP BY d.`date`, t.`airline`

CROSS JOIN用于生成每个dateairline组合)的结果,如OP中的示例输出所建议。

在这里演示

请尝试以下查询:

select e.date,a.name airline, count(r.id) total_route from route_tbl r
LEFT join entry_tbl e on r.date =e.date
LEFT join airline_tbl a on a.id= r.id
order by r.date
group by r.date

似乎您需要一个所谓的FULL JOIN以将“日期”和“航线”条目的所有组合与包含每天和航空公司的航线数的列一起使用。

令人遗憾的是,MySQL缺乏对FULL JOIN支持, 自几年以来就有一个功能请求被公开

仍然可以模拟这样的功能。 很好的阅读将是https://explainextended.com/2009/04/06/emulating-full-outer-join-in-mysql/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM