一种更有效的方法来执行此选择和更新循环

时间:2013-05-10 08:13:11

标签: mysql sql

这是我的表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

2 个答案:

答案 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,因此您需要处理所有。