加入两个Mysql表并对列进行分组

时间:2017-01-27 13:28:16

标签: mysql

我在mysql中获取所需的结果时遇到了一个小问题。

我有两个表如下(仅包含相关列):

CREATE TABLE vehicle_log
(id int(11) NOT NULL
,date date NOT NULL
,fuel_taken varchar(40) NOT NULL
,vehicle varchar(6) NOT NULL )

CREATE TABLE fuel_log
(id int(11) NOT NULL
,date date NOT NULL
,fuel_taken varchar(40) NOT NULL
,vehicle varchar(6) NOT NULL 
)

我的问题是获得一个结果,该结果返回一个分组车辆和日期列的表,同时还给出了其他两个fuel_amount列的总和,如下所示:

date       vehicle fuel_by_receipt fuel_by_log
2016-01-01 KKK222              150        NULL
2016-01-01 KKK252              100         150
2016-01-31 KKK222              120        NULL
2016-02-10 KKK252              100        NULL
2016-02-15 KKK252               50        NULL
2016-11-10 KKK252               20        NULL
2016-11-17 KKK252               10        NULL
2016-01-31 KKK252             NULL          90

用法是比较每个表中特定车辆和日期的fuel_amount列,以查看是否存在任何差异并提醒用户。这将在php中完成,但不是这个问题的主题。

此外,我需要返回条目,以便它必须在日期范围+上个月的最后一个条目之内。 (我已经有月,上个月的计算),我只是不知道如何将它包含在查询中。

我正在考虑使用WHERE子句,以便:

  

日期< = end_date和日期> = start_date

但我似乎只选择了上个月的最后一个条目。

这是我到目前为止所做的:

 SELECT f.date
      , f.vehicle
      , SUM(f.fuel_taken) fuel_by_receipt
      , SUM(v.fuel_taken) fuel_by_log
   FROM fuel_log  f
   LEFT 
   JOIN vehicle_log  v
     ON v.vehicle = f.vehicle 
    AND v.date = f.date  
  GROUP 
     BY f.date
      , f.vehicle
      , v.date     #<-- THIS LINE IS REDUNDANT
      , v.vehicle  #<-- AND SO IS THIS 

 UNION 

 SELECT f.date
      , f.vehicle
      , SUM(f.fuel_taken) fuel_by_receipt
      , SUM(v.fuel_taken) fuel_by_log 
   FROM fuel_log f
  RIGHT            #<-- NOBODY EVER USES RIGHT JOIN
   JOIN vehicle_log v
     ON v.vehicle = f.vehicle 
    AND v.date = f.date  
  GROUP 
     BY f.date
      , f.vehicle
      , v.date     #<- THIS IS REDUNDANT
      , v.vehicle  #<- AND SO IS THIS

我可能会从一个非常糟糕的角度来接近这个,所以如果你有任何建议可以使用更好更容易的方法,我会很高兴。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您有兴趣比较两个表之间的日期车辆组合。因此,您应首先获得SUM的每日期和一个车辆的分组,并将其加入另一个的分组日期车辆SUMS。因此,不要首先加入表的各个记录,而是加入分组的SUM。

在此之前,您应该首先获得所有可能的数据/车辆组合(通过在UNION中选择两个表格的车辆值并应用DISTINCT)。使用此表在日期/车辆字段上加入上述操作的结果。 希望这会让你受到启发!