在Mysql中为Report报告三个表

时间:2016-06-27 10:40:41

标签: php mysql

我想使用

为航空公司制作报告
  1. 日期表
  2. 航空公司表
  3. 路线表
  4. 我的日期表包含一系列日期

        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
    

    如何通过加入三个表来产生所需的结果?

3 个答案:

答案 0 :(得分:1)

您可以使用如下查询:

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来生成每个date - airline组合的结果,如OP中的示例输出所示。

Demo here

答案 1 :(得分:0)

请尝试此查询:

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

答案 2 :(得分:0)

您似乎需要一个所谓的FULL JOIN来包含日期和路线条目的所有组合,其中一列包含每天的航线数量和航空公司。

遗憾的是,MySQL缺乏对FULL JOIN的支持,有一个feature request open since some years

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