1

这是我的桌子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
4

2 回答 2

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

您可以在此处阅读有关多个更新的更多信息

于 2013-05-10T08:23:46.513 回答
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 ,所以你处理所有。

于 2013-05-10T08:17:56.443 回答