2011-12-23 45 views
0

我試圖想出一個投票系統,像這樣的一個很好的優雅的解決方案。如果有一種方法可以通過使用觸發器來實現優雅,我無法弄清楚,所以我嘗試使用存儲過程。這是我想出來的,這不是很好,所以我要求提供想法。我甚至可能會有一個查詢而不是查詢+存儲過程。但我真的很想知道一個乾淨的方式來更新用戶的積分並插入/更新投票。點在一個單獨的表中,通過程序進行更新。投票 - 存儲過程

給予好評

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 

Downvote

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 

Flipup

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 
+0

我剛纔已經回答類似於上述的(雖然它無關,與存儲過程),請閱讀我的答案[這裏](http://stackoverflow.com/a/8617640/1090079)來簡化你當前的查詢問題。 –

回答

0

我假定votes表有3列(POST_ID,USER_ID,重量)。您可以使用以下查詢:

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有你需要重新計算其總票數列。

+0

我並不十分關心插入部分。 –

+0

好的。但它也會更新。如果用戶已經在這篇文章中投票,它會更新新的權重 – ravnur

+0

我的意思是我關心在單獨的表中更新用戶點。 –

0

我個人沒有看到你的情況需要存儲過程。如果您正在跟蹤用戶投票,這意味着用戶ID可供您使用。我建議打開一個mysql事務,在投票表中執行插入操作,然後執行更新以跟蹤用戶的分數。那麼如果兩個調用都成功提交,這將確保數據的完整性。

也許你爲什麼要使用的程序,你可以分享具體的原因何在呢?