まず、クエリの 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"
書かれているように、このクエリは、すべてのフィールドの 1 セットのランダム データと合計を返します。ロールアップを使用して、別の行で合計を取得できます。
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 はその構文をサポートしていません。