2013-04-16 39 views
0

我試圖運行在MySQL不能指定在FROM子句

UPDATE studentassessment sa SET sa.issubmitted=FALSE WHERE 
sa.studentassessmentid <> 
    (SELECT studentassessmentid FROM studentassessment sa1 WHERE 
    sa.StudentId=sa1.StudentId 
    AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
    ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1) 
AND sa.studentid=568; 

此查詢,給了我這個錯誤

您不能指定目標,更新目標表'表在FROM子句

「山」的更新,我發現這類問題的數量,但它們是針對他們所問這樣沒有幫助我很多的疑問,從這樣一個答案我t裏德改變這樣

UPDATE studentassessment sa SET issubmitted=FALSE WHERE 
sa.studentassessmentid <> 
    (
     SELECT studentassessmentid FROM 
     (
      SELECT studentassessmentid FROM studentassessment sa1 WHERE 
       sa.StudentId=sa1.StudentId 
      AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
      ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1 
     ) AS T 
    ) 
AND sa.studentid=568; 

查詢然後,我開始收到此錯誤

未知列在 'where子句'

任何幫助 'sa.StudentId'?

編輯

這也沒有工作

UPDATE studentassessment sa 
INNER JOIN 
(SELECT studentassessmentid FROM studentassessment sa1 WHERE 
    sa.StudentId=sa1.StudentId 
    AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
    ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1) T 
ON sa.studentassessmentid<>T.StudentAssessmentId 
SET sa.issubmitted=0 
WHERE sa.studentid=568; 

回答

1

MySQL has that limitation;你不能更新你正在選擇的表格,而且你也沒有做任何事情。

當前,您無法更新表並從子查詢中的同一表中進行選擇。

但是你可以這樣做:

CREATE TEMPORARY TABLE studentassessmentids (
    `id` INT, 
    PRIMARY KEY (`id`) 
); 

LOCK TABLE studentassessment WRITE; 
INSERT INTO studentassessmentids (SELECT ... prepare your ids); 

UPDATE studentassessment sa 
SET sa.issubmitted=FALSE 
WHERE sa.studentassessmentid NOT IN (
    SELECT id 
    FROM studentassessmentids AS ids 
    WHERE ids.id = sa.studentassessmentid 
) 

UNLOCK TABLES; 
DROP TEMPORARY TABLE studentassessmentids; 

我從我不得不頂端寫的代碼,所以它不會直接合作,但希望你能採納的想法。

如果你能查詢改寫爲組JOIN語句,像(例如,從mysql.com):

UPDATE items,month SET items.price=month.price 
WHERE items.id=month.id; 

它應該工作,但我看不出你如何能實現NOT IN與加盟無需編寫難懂的代碼。

+0

謝謝!其實臨時表的概念在我腦海中,但我必須將查詢傳遞給某人運行,所以我想如果我可以在一個查詢本身做到這一點。那麼臨時桌子除外? –

+0

@PawanNogariya你也可以通過使用連接來做到這一點,但我不明白在這種特殊情況下你可以做到這一點。無論如何添加它來回答。 – Vyktor

+0

對不起,我沒有看到你的答案中的任何加入,儘管我也嘗試了加入,但沒有奏效,我將它添加到了我的問題中 –

0

找到了答案

UPDATE studentassessment dest, 
    (
     SELECT studentassessmentid,assessmentperiodid 
     FROM studentassessment sa WHERE sa.studentid=568 
     AND sa.studentassessmentid<> 
      (
       SELECT studentassessmentid FROM studentassessment s 
       WHERE s.studentid=568 
       AND sa.assessmentperiodid=s.assessmentperiodid 
       ORDER BY studentassessmentid DESC LIMIT 1 
      ) 

    )src 

    SET dest.issubmitted=FALSE 
    WHERE dest.studentassessmentid=src.studentassessmentid 
相關問題