我在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
我可能会从一个非常糟糕的角度来接近这个,所以如果你有任何建议可以使用更好更容易的方法,我会很高兴。
提前感谢您的帮助。
拍
答案 0 :(得分:0)
您有兴趣比较两个表之间的日期车辆组合。因此,您应首先获得SUM的每日期和一个车辆的分组,并将其加入另一个的分组日期车辆SUMS。因此,不要首先加入表的各个记录,而是加入分组的SUM。
在此之前,您应该首先获得所有可能的数据/车辆组合(通过在UNION中选择两个表格的车辆值并应用DISTINCT)。使用此表在日期/车辆字段上加入上述操作的结果。 希望这会让你受到启发!