mysql:在一个语句中选择和求和

标签 mysql sum

我想从多个表中选择数据,并且我想在一条语句中从一列中获取总和。如果我只使用 sum(列),我将结果限制在一行,如果我使用 group by,sum(列)似乎不起作用。或者我太愚蠢了。

可能还有更优雅的解决方案。 (它是第 6 行中的总和)。

SELECT 
    lb.date AS l_date, 
    gbb.id AS bid, 
    gbb.cash AS b_cash, 
    gpr.cash AS p_cash, 
    sum (gbb.cash) as t_cash,
    gbb.name
FROM 
    log_buildings lb, 
    game_building_basic gbb, 
    game_player_buildings gpb, 
    game_player_ress gpr
WHERE 
    lb.pid = :pid
    AND gpr.id = :pid
    AND gpb.pid = :pid
    AND lb.date >= gpr.date
    AND lb.bid = gbb.id
    AND gpb.buildings_id = gbb.id
    AND gpb.pid = :pid";

最佳答案

首先,您应该学习查询的 JOIN 语法:

SELECT lb.date AS l_date, gbb.id AS bid, gbb.cash AS b_cash, gpr.cash AS p_cash,
       sum (gbb.cash) as t_cash, gbb.name
FROM log_buildings lb join
     game_building_basic gbb
     on lb.bid = bgg.bid join
     game_player_buildings gpb
     on gpb.buildings_id = gbb.id join
     game_player_ress gpr
     on lb.date >= gpr.date
WHERE lb.pid = :pid AND gpr.id = :pid AND gpb.pid = :pid AND gpb.pid = :pid"

正如所写,此查询将为所有字段返回一组随机数据,以及总和。您可以使用汇总在单独的行中获取总数:

SELECT lb.date AS l_date, gbb.id AS bid, gbb.cash AS b_cash, gpr.cash AS p_cash,
       sum (gbb.cash) as t_cash, gbb.name
FROM log_buildings lb join
     game_building_basic gbb
     on lb.bid = bgg.bid join
     game_player_buildings gpb
     on gpb.buildings_id = gbb.id join
     game_player_ress gpr
     on lb.date >= gpr.date
WHERE lb.pid = :pid AND gpr.id = :pid AND gpb.pid = :pid AND gpb.pid = :pid"
group by lb.date, gbb.id, gbb.cash, gpr.cash, gbb.name with rollup

但是,您希望它作为一个单独的列,而不是单独的行(并且 rollup 在不同级别生成多个总和。为此,您需要一个子查询:

SELECT lb.date AS l_date, gbb.id AS bid, gbb.cash AS b_cash, gpr.cash AS p_cash,
       gbb.name,
       (select sum(gbb.cash)
        FROM log_buildings lb join
             game_building_basic gbb
             on lb.bid = bgg.bid join
             game_player_buildings gpb
             on gpb.buildings_id = gbb.id join
             game_player_ress gpr
             on lb.date >= gpr.date
        WHERE lb.pid = :pid AND gpr.id = :pid AND gpb.pid = :pid AND gpb.pid = :pid
       ) as t_cash
FROM log_buildings lb join
     game_building_basic gbb
     on lb.bid = bgg.bid join
     game_player_buildings gpb
     on gpb.buildings_id = gbb.id join
     game_player_ress gpr
     on lb.date >= gpr.date
WHERE lb.pid = :pid AND gpr.id = :pid AND gpb.pid = :pid AND gpb.pid = :pid

在几乎任何其他数据库中,您都可以使用 Windows 函数执行此操作:

SELECT lb.date AS l_date, gbb.id AS bid, gbb.cash AS b_cash, gpr.cash AS p_cash,
       gbb.name,sum(gbb.cash) over ()

但是MySQL不支持这种语法。

关于mysql:在一个语句中选择和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655857/

相关文章:

php - SQL查询查找客户下的订单总数

mysql - 如何将结果集行转换为列

php - 为什么使用我的主键 'code_giac' 来更新我的字段?

mysql - 类型错误 : Cannot read property 'query' of undefined?

java - 递归地对数组中的整数求和

php - 来自数据库的数据未显示在我的编辑页面中

c++ - 如何计算斐波那契数列的部分和?

matlab - 如何生成代表离散均匀分布之和的数字

r - 对于给定标识符,按日期范围对行求和

postgresql - Postgres : select the sum of values and then sum this again