【问题标题】:Voting - Stored procedures投票 - 存储过程
【发布时间】:2011-12-23 15:14:10
【问题描述】:

我正在尝试为 SO 之类的投票系统提出一个不错的优雅解决方案。如果有办法使用触发器优雅地做到这一点,我无法弄清楚,所以我正在尝试使用存储过程。这是我想出的,它不漂亮,所以我正在征求意见。我什至可能会有一个查询,而不是查询+存储过程。但我真的很想知道一种更新用户积分和插入/更新投票的干净方法。点在一个单独的表中,由程序更新。

点赞

INSERT INTO votes
ON DUPLICATE KEY
UPDATE votes
SET v.weight = v.weight + 1
WHERE v.weight = 0 OR v.weight = -1
AND v.userid = {$uid}
AND v.itemid = {$itemid}
//call procedure to +1 user points

投反对票

INSERT INTO votes
ON DUPLICATE KEY
UPDATE votes
SET v.weight = v.weight - 1
WHERE v.weight = 1 OR v.weight = 0
AND v.userid = {$uid}
AND v.itemid = {$itemid}
//call procedure to -1

翻转(当用户将投票从向上更改为向下时)

INSERT INTO votes
ON DUPLICATE KEY
UPDATE votes
SET v.weight = -1
WHERE v.weight = 1
AND v.userid = {$uid}
AND v.itemid = {$itemid}
//call procedure to -2

翻转

INSERT INTO votes
ON DUPLICATE KEY
UPDATE votes
SET v.weight = 0
WHERE v.weight = -1
AND v.userid = {$uid}
AND v.itemid = {$itemid}
//call procedure to +2

【问题讨论】:

  • 我刚刚回答了一个与上面类似的问题(虽然它与存储过程无关),请阅读我的回答here 以简化您当前的查询。

标签: mysql stored-procedures triggers


【解决方案1】:

我假设votes 表有 3 列(post_id、user_id、weight)。您可以使用以下查询:

insert into votes(post_id, user_id, weight) 
values(post_id_in, user_id_in, weight_in)
on duplicate key update
set
  weight = weight_in;

使用应该在(post_id, user_id)上有唯一的索引。

如果您对数据进行非规范化并且表 posts 有总票数列,您需要重新计算它。

【讨论】:

  • 我并不真正关心插入部分。
  • 好的。但它也会更新。如果用户已经在这篇文章中投票,它会更新新的权重
  • 我的意思是我关心单独表格中用户点的更新。
  • 如果我们谈论的是用户积分的总和(总值)。最好执行以下操作:1)在更新/插入之前,您应该获得先前的投票值; 2)适用于您的单独表total = total - previous_vote_value + current_vote_value
  • 我发现了 NEW 和 OLD 关键字,这应该很容易用触发器来完成。
【解决方案2】:

我个人认为您的情况不需要存储过程。如果您正在跟踪用户投票,这意味着您可以使用用户 ID。我建议打开一个 mysql 事务在投票表中执行插入,然后执行更新以跟踪用户的分数。然后,如果两个调用都成功提交事务,这将确保数据完整性。

也许您可以分享一下您为什么要使用程序的具体原因?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多