如何修复此 MySQL 查询使其正常工作?

Posted

技术标签:

【中文标题】如何修复此 MySQL 查询使其正常工作?【英文标题】:How to Fix This MySQL Query So It Works? 【发布时间】:2010-09-21 03:09:12 【问题描述】:

我有以下疑问:

UPDATE lessonstatus
INNER JOIN user ON lessonstatus.user_id = user.user_id
SET user_id = (SELECT user_id FROM user WHERE username = 'too_many_accounts')
WHERE last_name = 'stupid' 
AND first_name = 'user'
AND username != 'too_many_accounts'
AND lessonstatus.lesson_id NOT IN (SELECT lesson_id FROM lessonstatus WHERE user_id = 1);

但是,我在尝试执行时收到以下错误:

Error Code : 1093
You can't specify target table 'lessonstatus_rtab' for update in FROM clause

如何修复此查询以使其正常工作?

【问题讨论】:

术语提示:“重构”是在不修改功能的情况下改变代码的设计。修复损坏的代码不叫“重构”。 安德鲁,这是真的。定义“修复损坏的代码”的正确术语是什么? 我会保持简单并使用“修复”这个词。 :-) 【参考方案1】:

错误较多(“user”表和“user_rtab”别名不匹配,不推荐使用非限定字段名),但UPDATE语法本身应该类似:

UPDATE lessonstatus
SET user_id = (SELECT TOP 1 user_id FROM user WHERE username = 'too_many_accounts')
FROM lessonstatus
    INNER JOIN user ON lessonstatus.user_id = user_rtab.user_id
WHERE last_name = 'stupid' 
    AND first_name = 'user'
    AND username != 'too_many_accounts'
    AND lessonstatus.lesson_id NOT IN (
        SELECT lesson_id FROM lessonstatus WHERE user_id = 1
    );

【讨论】:

这可能适用于 MSSQL Server 或其他引擎,但不适用于 mysql "TOP" 是 Microsoft/Sybase 对 SQL 的扩展,MySQL 不支持它。即便如此,这也与原始查询中的错误无关。 我以某种方式确实将主题读作“MSSQL 查询”,抱歉。下次会努力的:)【参考方案2】:

您不能在同一查询中更新的表(即使在子查询中)SELECT。这就是错误“无法指定目标表”的意思。

但是您可以在UPDATE 语句中多次连接userlessonstatus,并创造性地使用连接条件来挑选您想要的单独行。

使用连接模拟NOT IN 的方法是执行LEFT OUTER JOIN。如果该连接的右侧不匹配,则 NOT IN 将是正确的。

UPDATE lessonstatus l1
  INNER JOIN user u1 ON (l1.user_id = u1.user_id)
  INNER JOIN user u2 ON (u2.username = 'too_many_accounts')
  LEFT OUTER JOIN lessonstatus l2 
    ON (l1.lesson_id = l2.lesson_id AND l2.user_id = 1)
SET l1.user_id = u2.user_id
WHERE u1.last_name = 'stupid' AND u1.first_name = 'user'
  AND u1.username != 'too_many_accounts'
  AND l2.lesson_id IS NULL; -- equivalent to "l NOT IN l2"

nb:我已经测试了这个查询的语法,但没有使用真实数据。无论如何,它应该让你开始。

【讨论】:

以上是关于如何修复此 MySQL 查询使其正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复我的 keycloak 上的 cors 错误以使其正常工作?

如何重写此 MySQL 查询,使其不会引发此错误:您无法在 FROM 子句中指定目标表 'crawlLog' 进行更新?

如何使用phpmyadmin和mysql从web下拉菜单中修复搜索功能? [重复]

如何修复查询条件或其他任何内容

如何修复此 WordPress 功能使其不返回 404 页面?

Mysql 转储 - 如何通过转义执行长查询?