2012-09-09 33 views
0

我試圖運行此查詢更新成員點當成員點等於最大值?設置贏家獎......但我得到這個錯誤..謝謝如何更新當一個值等於最大值?

錯誤:您的SQL語法錯誤;檢查對應於你的MySQL服務器版本如果我用近乎「WHERE a.points = MAX(a.points)和b.event_id = 4」 4行

 

    $sql=" 

    UPDATE engine4_event_membership a 
    INNER JOIN engine4_event_events b ON b.event_id = a.resource_id 
    SET a.points = a.points + case b.prize 
    WHERE a.points = max(a.points) AND b.event_id = '{$this->event->getIdentity()}'; 

    "; 

+1

'case b.prize'是什麼意思? – zerkms

+0

從b.prize中刪除case作爲@zerkms已經提到 – dbf

+0

如果$ this-> event-> getIdentity()在任何情況下都可以是字符串,那麼您的代碼可能容易受到SQL注入的攻擊。 – ekolis

回答

0

正確的語法手冊正確理解數據結構,可以使用WHERE子句中的相關子查詢來完成此操作。

您正在更新其中resource_id是輸入標識的成員資格表。您正在查找具有最高點的記錄。下面應該這樣做:

UPDATE engine4_event_membership a join 
     engine4_event_events b 
     on b.event_id = a.resource_id 
    SET a.points = a.points + b.prize 
    WHERE a.resource_id = '{$this->event->getIdentity()}' and 
      a.points = (select max(a2.points) 
         from engine4_event_membership a2 
         where a2.resource_id a.resource_id 
        ) 

這可能會得到相同的MySQL錯誤。因此,WHERE子句需要移動到聯接:

UPDATE engine4_event_membership a join 
     engine4_event_events b 
     on b.event_id = a.resource_id join 
     (select resource_id, max(points) as maxpoints 
     from engine4_event_membership 
     group by resource_id 
     ) amax 
     on a.resource_id = amax.resource_id and 
      a.points = amax.points 
    SET a.points = a.points + b.prize 
    WHERE a.resource_id = '{$this->event->getIdentity()}' 

無法使用目標表中的相關子查詢是在MySQL的限制。

+0

我可以在最後使用a2.resource_id ='{$ this-> event-> getIdentity()}',但仍然出現錯誤:錯誤:無法指定目標表'一個'在FROM子句 – user1644152

+0

更新是爲第二個版本? –

+0

此工程.. SE4 UPDATE engine4_event_membership上b.event_id = a.resource_id聯接 engine4_event_events b 加入 (選擇RESOURCE_ID,最大值(點),通過RESOURCE_ID maxpoints 從engine4_event_membership 組)上b.event_id AMAX = amax.resource_id和a.points = maxpoints SET a.points = a.points + b.prize WHERE a.resource_id ='{$ this-> event-> getIdentity()}' – user1644152

相關問題