Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 复杂查询组合_Php_Mysql_Sql - Fatal编程技术网

Php 复杂查询组合

Php 复杂查询组合,php,mysql,sql,Php,Mysql,Sql,首先,谢谢你阅读我的问题。我非常感谢社区中的人们帮助其他人学习更多关于编码的知识。由于这种SQL和PHP是我爱好的一部分,我受到谷歌和论坛的限制,在那里我可以找到我问题的答案。不幸的是,对于遇到的问题,我找不到一个好的答案 我想做什么? 我开了一个网站,在那里你可以记下你的公里数和升数,然后查看你的统计数据。我想用一个查询在MySQL中做一个大的搜索。确切地说,我知道如何在多个查询中得到结果,但我需要在一个查询中得到结果 我的桌子看起来像什么? 例如,我使用这个表使问题更加直观,现在它被命名为“

首先,谢谢你阅读我的问题。我非常感谢社区中的人们帮助其他人学习更多关于编码的知识。由于这种SQL和PHP是我爱好的一部分,我受到谷歌和论坛的限制,在那里我可以找到我问题的答案。不幸的是,对于遇到的问题,我找不到一个好的答案

我想做什么? 我开了一个网站,在那里你可以记下你的公里数和升数,然后查看你的统计数据。我想用一个查询在MySQL中做一个大的搜索。确切地说,我知道如何在多个查询中得到结果,但我需要在一个查询中得到结果

我的桌子看起来像什么? 例如,我使用这个表使问题更加直观,现在它被命名为“fillings”

+---------+---------+------------+--------+--------+------------+
| tank_id | user_id | kilometers | liters | car_id | date       |
+---------+---------+------------+--------+--------+------------+
| 1       | 2       | 450        | 20     | 2      | 2017-11-01 |
+---------+---------+------------+--------+--------+------------+
| 2       | 1       | 500        | 30     | 1      | 2017-12-15 |
+---------+---------+------------+--------+--------+------------+
| 3       | 2       | 490        | 25     | 2      | 2017-11-05 |
+---------+---------+------------+--------+--------+------------+
| 4       | 3       | 260        | 19     | 3      | 2017-11-07 |
+---------+---------+------------+--------+--------+------------+
| 5       | 3       | 610        | 30     | 3      | 2017-12-03 |
+---------+---------+------------+--------+--------+------------+
| 6       | 3       | 100        | 4      | 3      | 2017-12-07 |
+---------+---------+------------+--------+--------+------------+
这是我的主表的一个基本概念,所有的填充都是在主表中注册的。实际上,一个人可以有多辆车,但现在让我们假设一个用户只有一辆车

什么是SQL查询? 我要进行的查询应具有以下结果:

+---------+----------------------+---------------------+
| user_id | consumption november | consumption overall |
+---------+----------------------+---------------------+
| 2       | 20,9                 | 20,9                |
+---------+----------------------+---------------------+
| 1       |                      | 16,7                |
+---------+----------------------+---------------------+
| 3       | 13,7                 | 18,3                |
+---------+----------------------+---------------------+
正如你所看到的,11月份的填充物正在使用,消费量正在计算中。此外,还计算了特定类型用户的所有填充物的总消耗量。我知道如何得出这个结果,分为两个查询。那就是:

SELECT user_id, SUM(kilometers) / SUM(liters) as consumption overall
FROM fillings
GROUP BY user_id
以及查询:

SELECT user_id, SUM(kilometers) / SUM(liters) as consumption november
FROM fillings
WHERE 'date'
BETWEEN '2017-11-01' AND '2017-11-31'
GROUP BY user_id
所以现在我想把这些查询合并成一个查询,这样我就可以得到我想要的结果。注意,在这个例子中,一个人在一个月内可以有一个空消费量,因为他或她在那个月没有给他们的车加满油

我已经研究过工会和加入的选择,但我似乎找不到一个办法来让这一切顺利进行

我希望一切都清楚,如果不清楚,请不要犹豫询问,我将进一步详细解释


提前谢谢。

你可以试试类似的东西

SELECT t1.user_id, 
    t1.consumption_overall as consumption overall,
    t2.consumption_november as consumption november
FROM (
    SELECT user_id, SUM(kilometers) / SUM(liters) as consumption_overall
    FROM fillings
    GROUP BY user_id
) as t1, (
    SELECT user_id, SUM(kilometers) / SUM(liters) as consumption_november
    FROM fillings
    WHERE 'date'
    BETWEEN '2017-11-01' AND '2017-11-31'
    GROUP BY user_id
) as t2
WHERE t1.user_id = t2.user_id

它将获取两个查询的结果并将它们放在同一个表中。

只需使用条件聚合:

SELECT user_id,
       (SUM(CASE WHEN date >= '2017-11-01' AND date < '2017-12-01'
                 THEN kilometers ELSE 0
            END) /
        SUM(CASE WHEN date >= '2017-11-01' AND date < '2017-12-01'
                 THEN liters
            END)
       ) as consumption_november,        
       SUM(kilometers) / SUM(liters) as consumption_overall
FROM fillings
GROUP BY user_id

由于记录可能不在该月的范围内,建议对特定于日期的查询使用左联接:

 SELECT 
 t1.user_id, t2.consumption_november, t1.consumption_overall 
 FROM (
   SELECT user_id, SUM(kilometers) / SUM(liters) as consumption_overall 
   FROM fillings 
   GROUP BY user_id
 ) t1
 LEFT JOIN 
 (
   SELECT user_id, SUM(kilometers) / SUM(liters) as consumption_november 
   FROM fillings 
   WHERE `date` BETWEEN '2017-11-01' AND '2017-11-31'
   GROUP BY user_id
 ) t2
 ON t1.user_id = t2.user_id;

在我的第一个回答中,对于您的问题的扩展答案,由于作为评论留下的时间太长,请使用:

挑选 t1.用户id,t2.消费量,11月,t3.消费量,t1.总体消费量 从…起 选择用户标识,以公里/升为总消耗量 从填充物 按用户id分组 t1 左连接 选择用户标识,单位公里/单位升作为消耗量 从填充物 其中[日期]介于“2017-11-01”和“2017-11-31”之间 按用户id分组 t2 在t1.user\u id=t2.user\u id上 左连接 选择用户标识,单位公里/单位升作为消耗量 从填充物 其中[日期]介于“2017-08-01”和“2017-11-31”之间 按用户id分组 t3 在t1.user\u id=t3.user\u id


对于后续的左连接,只需从最后的左连接中删除分号并扩展模式,然后在SELECT子句中添加新字段。

这对我很有效,非常感谢!如果我想再增加一列关于过去3个月消费量的数据,比如2017-09-01和2017-11-31。。。?我尝试添加另一个左连接,正如您在回答中所做的那样,我在最后一行添加了=t3.user\u id,但不幸的是,这没有起作用。当然,我还更改了子查询的确切日期。我做错什么了吗?非常感谢你的回答。谢谢你的回答。这也适用于我,非常感谢。谢谢你的回答。非常感谢。