如何修复此 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
语句中多次连接user
和lessonstatus
,并创造性地使用连接条件来挑选您想要的单独行。
使用连接模拟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下拉菜单中修复搜索功能? [重复]