Php 在数据库中存储sum()结果与在运行时计算结果

Php 在数据库中存储sum()结果与在运行时计算结果,php,mysql,sql,database-design,Php,Mysql,Sql,Database Design,我不熟悉sql和php,不确定在这种情况下如何处理: 我创建了一个包含两个表的mysql数据库。 一个是用户列表及其数据,每个用户都有一个唯一的id。 第二种方法向用户奖励一定数量的分数,相关列为用户id和奖励分数。此表应该定期获取新条目,单个用户可以在其中出现的次数没有限制 在我的php页面上,我现在想显示一个按总积分排序的用户列表 我的第一种方法是在用户表中创建一个“points_total”列,打算运行某种查询,每次向另一个表添加新条目时,都会计算并更新每个用户的正确总数。为了检索数据,我

我不熟悉sql和php,不确定在这种情况下如何处理:

我创建了一个包含两个表的mysql数据库。 一个是用户列表及其数据,每个用户都有一个唯一的id。 第二种方法向用户奖励一定数量的分数,相关列为用户id和奖励分数。此表应该定期获取新条目,单个用户可以在其中出现的次数没有限制

在我的php页面上,我现在想显示一个按总积分排序的用户列表

我的第一种方法是在用户表中创建一个“points_total”列,打算运行某种查询,每次向另一个表添加新条目时,都会计算并更新每个用户的正确总数。为了检索数据,我可以使用一个非常简单的查询,甚至可以使用sql的排序功能

然而,虽然使用sum where函数可以很容易地更新特定用户的总计,但我看不到一种方法可以对整个用户表进行更新。毕竟,纯sql不提供对表的每一行进行迭代的能力,还是我缺少了另一种方式? 我可能可以通过在php中查看表来进行更新,但我也不确定这是否是一个好的方法,因为在某种程度上,将点数据存储两次(一个表中的总数,然后在另一个表中包含一些附加信息的点分解)似乎是多余的

另一种选择是放弃额外的列,而是在每次访问php页面时计算总和,然后使用php进行排序。但是,我认为这比在数据库中准备好数据要慢得多,如果表中有很多条目,这可能是一个问题


我在这里有点不知所措,因此任何建议都将不胜感激。

要获得奖励的总分,您可以使用类似以下的查询:

SELECT 
    `user_name`,
    `user_id`,
    SUM(`points`.`points_award`) as `points`,
    COUNT(`points`.`points_award`) as `numberOfAwards`
FROM `users`
JOIN `points`
    ON `users`.`user_id` = `points`.`user_id`
GROUP BY `users`.`user_id`
ORDER BY `users`.`user_name` // or whatever users column you want.

您当然可以使用SQL来实现这一点。决定性因素可能是被查询的数据量。由于这是一个累积列,是否可以插入日期较早的行?如果是这样,请在运行时计算,或查看数据仓库。除了在用户中存储和维护“总计”字段外,您还可以构造一个简单的SQL查询来提供总计。除非您希望记录的数量达到极限,否则此方法可能适合您。如果您希望有很多记录,例如数百万条记录,那么在points表上设置触发器(插入和更新)来更新用户记录就可以了。如果更新了积分记录,则会出现复杂情况。您需要减去原始记录中的点,然后在新记录中添加点。@mkaatman这是一个
数据库设计
问题,因此肯定会有一些主观性。如果SO中允许使用
数据库设计
标志,则也应允许此类问题。@mkaatman,我同意Giorgos Altanis的观点。有一些主观性,但这是一个关于两种可能的方法以及如何实现每种方法的问题。然而,这只给了id为1的用户的总分,对吗?有可能通过一个sql查询得到每个用户的总数吗?@rs11只需忽略
WHERE
clausethanks,yea应该知道group by语句:D这基本上解决了我的问题,很高兴它有所帮助。