2

我正在开发一个 PHP 和 MYSQL 评级系统,投票赞成和反对。

我有一个名为的数据库votes,其中包含注册用户所做的所有投票(1 表示赞成票,-1 表示反对票)对于每个可以评级的帖子,都有一个所有赞成票、反对票和净票的回顾(赞成票减去反对票)。

当有人对帖子投票时,会有一个INSERT ... ON DUPLICATE KEY UPDATE查询插入或更新包含所有投票的表。然后我用新的赞成票数、反对票数和新的净票数更新帖子行。

我的问题是我需要知道第一个查询是插入还是更新,因为如果是更新,我将需要减去旧投票并添加新投票,但 id 这只是我不需要的插入减去任何东西并增加投票。

4

2 回答 2

2

我建议您不要过早地优化投票计算,并且在每次对某个帖子进行新投票后,您只需重新计算该帖子的所有投票,无论是否INSERT触发UPDATE了重新计算。然后将结果存储到数据库。

此外,它更简单地丢弃甚至总票数缓存并在需要时即时计算这些。

只有当您遇到性能问题时,您才应该衡量您的费用并检查瓶颈是什么。奇怪的是,投票计算不应该是您的应用程序中首先要优化的事情。

让您的生活更简单。

于 2012-07-22T18:06:29.553 回答
2

假设你有一个PRIMARY KEY在桌子上,你可以这样做:

SET @last_insert_id := IFNULL(LAST_INSERT_ID(), 0);

INSERT ... ON DUPLICATE KEY UPDATE ...

SELECT IFNULL(LAST_INSERT_ID(), 0) <> @last_insert_id AS inserted;

如果inserted为 TRUE,则插入记录,如果为 FALSE,则更新现有记录。

当然,此代码假定第一个LAST_INSERT_ID()不是从插入到另一个表中设置的。

于 2012-07-22T18:30:48.033 回答