2011-12-23 16 views
0

私はSOのような投票システムのための素敵なエレガントなソリューションを考え出しています。トリガを使用してエレガンスでそれを行う方法がある場合、私はそれを把握することができませんでしたので、私はストアドプロシージャで試しています。これは私が思いついたことです、それはかなりではありませんので、私はアイデアを求めています。おそらく、クエリ+ストアドプロシージャではなく、1つのクエリを持つことさえあります。しかし、私は本当にユーザーのポイントを更新し、投票を挿入/更新するためのきれいな方法を知りたいと思います。ポイントは、プロシージャによって更新される別のテーブルにあります。 (ユーザーの変更がアップからダウンに投票)投票 - ストアドプロシージャ

Upvote

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 

Flipdown

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、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には、それを再計算する必要がある投票総数の列があります。

+0

私は本当に挿入部分について心配していません。 –

+0

しかし、それも更新されます。ユーザーがすでにこの投稿に投票した場合、新しい重みで更新されます – ravnur

+0

私は、別のテーブルのユーザーポイントの更新に関係しています。 –

0

私は個人的にあなたのケースでは、ストアドプロシージャの必要性が表示されません。ユーザー投票を追跡している場合は、ユーザーIDが利用可能であることを意味します。私は、mysqlトランザクションを開いて、投票テーブルにあなたの挿入を実行し、ユーザのスコアを追跡するための更新を行うことをお勧めします。両方の呼び出しが成功した場合、トランザクションをコミットすると、データの整合性が保証されます。

多分あなたは手順を使用する理由を具体的に分かち合うことができますか?