0

このクエリをmysqlで実行しようとしています

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 句で更新対象のテーブル 'sa' を指定することはできません

このタイプの質問がいくつか見つかりましたが、それらは質問されたクエリに固有のものであるため、SOの回答の1つからあまり役に立ちませんでした。クエリをこのように変更しようとしました

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;
4

2 に答える 2

1

MySQL にはその制限があります。選択しているテーブルを更新することはできず、それについて何もしていません。

現在、サブクエリでテーブルを更新して同じテーブルから選択することはできません。

ただし、これを行うことができます:

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うまくいくはずですが、読みにくいコードを書かずに結合を実装する方法がわかりません。

于 2013-04-16T11:15:40.923 に答える
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
于 2013-04-16T11:34:35.440 に答える