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 我试图改变这样的查询的答案之一

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 回答