存储sum()导致数据库与运行期间的计算

时间:2017-04-03 15:22:53

标签: php mysql sql database-design

我是sql&的新手。 php并且不确定如何在这种情况下继续:

我用两个表创建了一个mysql数据库。 一个是具有其数据的用户列表,每个用户都具有唯一ID。 第二个向用户授予一定数量的积分,相关列是用户ID和奖励积分数量。该表应该定期获取新条目,并且单个用户可以在其中出现的次数没有限制。

在我的php页面上,我现在想要显示按总点数排序的用户列表。

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

但是,虽然使用功能总和来更新特定用户的总数很容易,但我没有看到为整个用户表执行此操作的方法。毕竟,普通的sql不能提供迭代表中每一行的能力,或者我错过了不同的方式? 我可以通过在php中查看表来进行更新,但是再一次,我不确定这是否是一个好的方法,因为在某种程度上存储点数据两次(总数为一个表然后点分解以及另一个表中的一些附加信息)似乎是多余的。

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

我有点迷失在这里,所以任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

要获得总分数,您可以使用与此类似的查询:

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.