这是我的表votes
。
"id" "votedElm" "voteType" "voteProcessed" "country"
"3" "6" "1" "0" "US"//1-1=0
"4" "8" "0" "0" "US"//2+0-1=1
"9" "8" "1" "0" "US"
"5" "9" "0" "0" "US"//2+0-1=1
"10" "9" "1" "0" "US"
这是我的表likes
"id" "type" "parent" "country" "votes"
6 10 3 US 1
8 10 7 US 2
9 10 7 US 2
我在事件中更新表likes
:
//Pseudocode - This actually is inside an mysql scheduled event
//Select all the votes
select id, votedElm, voteType, country from votes
if voteType = 0 then
update likes set votes=votes+1 where id=votedElm and country=country
update votes set voteProcessed = 1 where id = id
elseif voteType = 1 then
update likes set votes=votes-1 where id=votedElm and country=country
update votes set voteProcessed = 1 where id = id
End If
这一切都是一次一行。你看到在这里做一个更好更有效的方法吗?
见下事件:
BEGIN
DECLARE vId INT(10) DEFAULT '0';
DECLARE vElm INT(10) DEFAULT '0';
DECLARE vType TINYINT(1) DEFAULT '0';
DECLARE vProcessed TINYINT(1) DEFAULT '0';
DECLARE vCountry VARCHAR(2) DEFAULT "";
DECLARE updateDone INT DEFAULT FALSE;
-- declare cursor for employee email
DEClARE updater CURSOR FOR
SELECT id, votedElm, voteType, voteProcessed, country FROM votes;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET updateDone = TRUE;
OPEN updater;
doUpdate: LOOP
FETCH updater INTO vId, vElm, vType, vProcessed, vCountry;
IF updateDone THEN
LEAVE doUpdate;
END IF;
-- update likes
UPDATE likes
INNER JOIN votes
ON votes.vElm = likes.id AND votes.vCountry = likes.country
SET
likes.votes = IF(votes.vType = 0,likes.votes+1,likes.votes-1),
votes.vId = 1;
END LOOP doUpdate;
CLOSE updater;
END
答案 0 :(得分:3)
你可以试试这个:
UPDATE
likes
INNER JOIN votes
ON votes.votedElm = likes.id
AND votes.country = likes.country
SET
likes.votes = IF(votes.vote_type = 0,likes.votes+1,likes.votes-1),
votes.voteProcessed = 1
WHERE
votes.voteProcessed = 0
您可以阅读有关多个更新的更多信息here
答案 1 :(得分:0)
您只需进行3次更新:
update likes set votes=votes+1 where voteType = 0
update likes set votes=votes-1 where voteType = 1
update votes set voteProcessed = 1
此处假设您只有voteType = 0,1,因此您需要处理所有。