2013-05-10 61 views
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 

回答

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

+0

我有一个凝灰岩时间让我的事件内工作。我都对列名和变量名感到困惑。你可以看看我的活动吗?我在问题中发布了它。 – Norman 2013-05-10 09:16:29

+0

您正试图从'votes'表中执行此查询...但是此查询会更新所需的所有行,请尝试单独执行 – Stephan 2013-05-10 09:19:52

+0

或仅删除循环,因为您不需要它 – Stephan 2013-05-10 09:21:13

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,所以你处理所有。

+0

你说得对。 VoteType是0或1 – Norman 2013-05-10 08:20:23

+0

@codedad'where where'? – Shikiryu 2013-05-10 08:23:20

+0

@Shikiryu:纠正,thx! – nzs 2013-05-10 08:28:07