这是我的表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
这整个事情发生在一次一行。你看到更好更有效的方法来执行sql吗?
继承人的事件:
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
我有一个凝灰岩时间让我的事件内工作。我都对列名和变量名感到困惑。你可以看看我的活动吗?我在问题中发布了它。 – Norman 2013-05-10 09:16:29
您正试图从'votes'表中执行此查询...但是此查询会更新所需的所有行,请尝试单独执行 – Stephan 2013-05-10 09:19:52
或仅删除循环,因为您不需要它 – Stephan 2013-05-10 09:21:13