0
select id as ids from challenges where expire_date > today

(phpのforeach)のようにIDを乗算するために彼女をループする必要があります

foreach (ids) 

    update challenges set status = 'expired' where id = ids

    update user_challenge set challenge_status = 'Expired' where challenge_status = 'Pending' and challenge_id = ids 
    update user_challenge set challenge_status = 'Failed' where challenge_status = 'Accepted' and challenge_id = ids 

end for each;

誰でもこれを実行するストアド プロシージャまたは単一のクエリを作成できますか、ありがとう

4

2 に答える 2

1

MySql での単一の更新クエリは次のようになります。

UPDATE user_challenge u INNER JOIN
       challenges c ON u.challenge_id = c.id
   SET c.status = 'Expired',
       u.challenge_status = CASE WHEN u.challenge_status = 'Pending' THEN 'Expired' 
                                 WHEN u.challenge_status = 'Accepted' THEN 'Failed' END
 WHERE c.expire_date < CURDATE()

ここにSQLFiddleの例があります

意味のある有効期限の条件expire_date < CURDATE()は、クエリに反映されている (つまり、有効期限が今日の日付よりも前でなければならない) 必要があると思います。

于 2013-03-24T19:09:18.607 に答える
0

カーソルを宣言し、カーソルを使用してクエリの結果をループすることができます

この構文は T-SQL 用ですが、MySQL の場合も同様です。

declare @id int
declare @cursor cursor;
set @cursor = cursor for select id as ids from challenges where expire_date > today
open @cursor
fetch next from @cursor into @id
while(@@FETCH_STATUS = 0)
begin
   update challenges set status = 'expired' where id = @id

    update user_challenge set challenge_status = 'Expired' where challenge_status = 'Pending' and challenge_id = @id
    update user_challenge set challenge_status = 'Failed' where challenge_status = 'Accepted' and challenge_id = @id 

  fetch next from @cursor into @id   
end
close @cursor
deallocate @cursor
于 2013-03-24T19:14:20.160 に答える