【问题标题】:Sum row contents from a joined table汇总联接表中的行内容
【发布时间】:2015-12-06 17:43:54
【问题描述】:

我这里有两张桌子。

  • log(代表日志)
  • act(代表行动)

日志

包含列:logiduseridactid

行动

包含列:actidamount

Amount 表示当相应的actid 插入日志 (log) 时用户 (userid) 收到的点数(例如 700 中的 50 或 5)。

我想要实现的是,当您搜索 userid 1 时,选择 log 中的所有行,其中 userid = 1 被选中。然后,从这些选定的log-rows 中,actids 应在表act 中查找,amounts 应相加。

简而言之:

  • 选择log-rows 其中userid = 1

  • 从这些行中取出所有actids

  • act 表中找到匹配的amount

  • 总结所有这些amounts

我从这个查询开始:

SELECT log.logid, log.userid, log.actid, act.actid, act.amount
FROM log
    JOIN act
        ON act.actid = log.actid
WHERE log.userid = '1'

这给了我一张桌子(除其他外)

用户名 |金额

---1----|--20---

---1----|--40---

---1----|---5---

---1----|--10---

现在我想sum所有这些金额并回显总数,但遗憾的是我找不到对此有效的查询。

编辑:

我使用火影忍者提供给我的查询来汇总这些金额。这现在就像一个魅力!查询:

SELECT log.userid, sum(act.amount) FROM log JOIN act ON act.actid = log.actid WHERE log.userid = '1'

接下来我要尝试的是不仅从userid = 1 的用户那里获取总和,还从user 表中的其他用户那里获取总和。之后,我想在以下查询中使用这些总和:

$result = $mysqli->query("SELECT * FROM `db`.`user` ORDER BY `summed_amount` DESC");

其中summed_amount是火影忍者查询产生的总和。

【问题讨论】:

标签: php mysql join sum


【解决方案1】:

MySQL 有一个名为 sum() 的聚合函数,可以对所有记录求和。

所以你的查询将是

SELECT log.userid, sum(act.amount) FROM log JOIN act ON act.actid = log.actid WHERE log.userid = '1'

http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_sum

【讨论】:

  • 你会怎样用最少的代码来回显这个总和?首先,我这样说:$result = $mysqli->query({here go your query})。但是然后呢,使用 mysqli_fetch_assoc()?还是有更好的方法?
  • mysqli_fetch_assoc() 适合它。如果您的问题得到解决,请将解决方案标记为已接受。这样可以帮助其他寻找类似问题的人
  • 非常感谢火影忍者!我在帖子末尾添加了一个额外的问题,请您看一下并告诉我我想要实现的目标是否可行?
  • 您的查询有点混乱.. 告诉我您到底想达到什么目的
  • 请检查我刚刚添加的另一个答案来解决您的问题。如果您的问题得到解决,请将解决方案标记为已接受
【解决方案2】:

通过单个查询使用group by子句获取所有用户的总和。这里它将计算每个用户的amaount总和并返回结果。

SELECT log.userid, sum(act.amount) FROM log JOIN act ON act.actid = log.actid group by log.userid

编辑:- 按 desc 获取订单

SELECT log.userid, sum(act.amount) FROM log JOIN act ON act.actid = log.actid group by log.userid order by sum(act.amount) desc

【讨论】:

  • 是否可以在 ORDER BY 子句中使用这些总和来回显所有用户 ID 与他们自己的总和,按总和 DESC 排序?
  • 是的,您可以添加 order by 子句以按总和降序获得结果
  • 如果您的问题得到解决,请将解决方案标记为已接受。这样可以帮助其他寻找类似问题的人
  • 我在第一篇文章中稍微简化了情况,但现在我根据我的实际情况编辑了您的第二个查询(要加入另一个表),我很高兴它可以工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多