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