在MySQL中怎样执行一次查询获得多次查询结果之和

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MySQL中怎样执行一次查询获得多次查询结果之和相关的知识,希望对你有一定的参考价值。

首先,这里有一个BILL_ITEM表,表的内容是

然后,我执行了三条SQL语句
SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1005';
SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1015';
SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1010';
返回的结果是:
系统返回3个结果:

我现在想只执行一次查询,获得一个结果,结果中包含以上3行内容,请问高手这个SQL语句怎么写?
不好意思,在这里再次解释一下:
BILL_ITEM表的两个字段CLIENT_ID指的是客户ID,FEE指的是应付费用,
正如大家所看到的,CLIENT_ID在BILL_ITEM表中是有重复的。
我的目的是根据这个表算出每位客户总共应该付多少钱,我写的数据和SQL语句只是一个示例,大家要能不依赖表中数据(例如1005,1010,1015等)写SQL语句。
麻烦看一下!

select a.fee1,a.CLIENT_ID,b.fee2,b.CLIENT_ID2,c.fee3,c.CLIENT_ID3
from
(SELECT SUM(FEE) fee1,CLIENT_ID CLIENT_ID1 FROM bill_view2 WHERE CLIENT_ID=\'1005\') a,
(SELECT SUM(FEE) fee2,CLIENT_ID CLIENT_ID2 FROM bill_view2 WHERE CLIENT_ID=\'1015\') b,
(SELECT SUM(FEE) fee3,CLIENT_ID CLIENT_ID3 FROM bill_view2 WHERE CLIENT_ID=\'1010\') c

直接运行一下

追问

不好意思,我的数据只是示例,麻烦您在看看我刚刚的问题补充。

追答select group_concat(concat(fee,\' \',client_id))
from
(select sum(fee) fee,client_id from bill_view2 group by client_id) t

我只能给你做到这样,你看符合你要求吗

参考技术A SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1005' union all
SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1015' union all
SELECT SUM(FEE),CLIENT_ID FROM bill_view2 WHERE CLIENT_ID='1010';

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?

SQL 多次从一个表中查询耗费什么?

这个要看你的数据量来决定.

SQL 多选一个字段值只选一次
意味着你 只发送一次 SQL 语句, 然后获得结果集合。

多次从表里查询但查的字段较少
意味着你 发送了多个 SQL 语句, 然后分别获得结果集合。

SQL 多次从一个表中查询
耗费的是:

网络之间,要额外传送SQL语句 (这个很多情况下,消耗可以忽略)

数据库需要 分析你的 SQL语句的合法性,并做SQL的解析,并分析查询计划,并从多个查询计划中,选择一个最优的查询计划,然后进行执行处理。 (这个过程消耗比较大,假如数据库参数配置的好。或者开发语言处理的时候,就是按照 一条SQL,修改参数的方式处理的话,那么消耗也不大)追问

数据倒是不多,关键是我想了解清楚性能的问题。

追答

数据不多,那就一次 获取完就可以了.

因为这个没有一个固定的值.
假如你数据量大, 比如1000万.
你要一个 SQL语句, 一次 一口气读这一千万数据, 即时你数据库受得了,你的 客户端程序不知道会不会内存溢出。
那么这个时候,应该需要拆分处理,比如一条SQL获取 1万行, 或者 10万行, 客户端处理完一批数据了,再去重新检索一次,获取下一批的数据。

但是你数据量很小,比如就10行数据。
那显然是 一条SQL获取一下, 客户端一次就把数据获取完了。
这个情况下,要分 10条 SQL语句, 去执行10次, 分别获取 10次 1行数据。没有太大的意义。

参考技术A SQL 多选一个字段值只选一次 当然比 多次从表里查询但查的字段较少 相比哪个性能更好
因为 SQL 多次从一个表中查询耗费 i/0 开销,如果多个用户的话 容易出现 假死 i /o 开销过大
SQL 多选一个字段值只选一次 多选一个字段 对于数据库来说 基本没有什么影响, 但主要是在程序中加载时,循环取出字段 多了点 也就是 关键看程序
参考技术B SQL多次从一个表中查询的话,只会在内存中提取相应的数据,别的过程还是要正常走的!追问

比如我依次用一条新的sql从database中取id为1,2,3,4的数据,执行完id=1的那次以后,2,3,4的不会在缓存中取吧

追答

这个主要还是要看你实用的数据库是什么了ORACLE在这点上要比SQLSERVER要好很多,SQLSERVER本身内存使用是很大的,而且缓存中清除也不是很及时!

追问

好吧 我用的MySql数据库,数据不是很多,点击量大了会不会出现一楼说的那种死页面的情况?

追答

看你服务器的性能了,这种问题分页取一下就很简单解决了!

参考技术C Select Distinct(*) From Table AS Ta inner Join Table As Tb on Ta.A=Tb.a and Ta.B<>Tb.B

以上是关于在MySQL中怎样执行一次查询获得多次查询结果之和的主要内容,如果未能解决你的问题,请参考以下文章

PHP查询mysql的时候用了like和LIMIT分页,如何获得未分页但是like了的总数据量

mysql 用多次查询代替一次复杂join查询的优点分析

MySQL 多表关联查询和多次单表查询哪个好?

Python-Sqlalchemy-Postgres:如何将子查询结果存储在变量中并将其用于主查询

SQL 多次返回相同的结果

如何在mysql查询中获得排序结果?