SQL Update + Inner Join on a range of rows
SQL Update + Inner Join on a range of rows
我有 table "Temp" 和 table "Today",具有相同的列名("url" 和 "date")。
我想在 url 匹配时更新 "Temp" table 的 "date" 列。
但是我的 table 相当大(30K 个元素)并且 phpmyadmin 不想执行以下 - 正确 - 查询:
update Temp Tp
inner join Today Ty on
Tp.url = Ty.url
set Tp.date = Ty.date
我得到一个 "Query execution was interrupted, error #1317"
为什么 ?我预计这是因为我支付了共享服务器 (OVH) 的费用,并且我无法执行超过 2-3 秒的查询。
无论如何,现在我想逐个范围地执行这个查询。前 1000 行,1000-2000 等
我尝试了以下方法:
update Temp Tp
inner join
(
select Tp2.date
from Temp Tp2
inner join Today Ty2
on Tp2.url = Ty2.url
limit 1000
) Ty on Tp.url = Ty.url
set Tp.date = Ty.date
但我收到以下错误:#1054 - 'on clause'
中的未知列 'Ty.url'
我找不到原因?
据我所知,这里有两个问题。首先,正如@pmbAustin 已经提到的,您在子查询中缺少一列。
其次,我认为您的子查询应该从 Ty2 而不是 Tp2 选择日期:
update Temp Tp
inner join
(
select Ty2.date, Tp2.url
from Temp Tp2
inner join Today Ty2
on Tp2.url = Ty2.url
limit 1000
) Ty on Tp.url = Ty.url
set Tp.date = Ty.date
参见SQLFiddle(尽管出于实际原因,此演示仅限于 2 个)。
虽然您没有特别询问过这个问题(您可能已经知道),但为了完整起见,应该提到对于后续查询,LIMIT
应该与 OFFSET
一起使用(或者只需使用快捷方式 LIMIT 1000, 1000
、LIMIT 2000,1000
、LIMIT <offset>, <limit>
等
我有 table "Temp" 和 table "Today",具有相同的列名("url" 和 "date")。
我想在 url 匹配时更新 "Temp" table 的 "date" 列。 但是我的 table 相当大(30K 个元素)并且 phpmyadmin 不想执行以下 - 正确 - 查询:
update Temp Tp
inner join Today Ty on
Tp.url = Ty.url
set Tp.date = Ty.date
我得到一个 "Query execution was interrupted, error #1317" 为什么 ?我预计这是因为我支付了共享服务器 (OVH) 的费用,并且我无法执行超过 2-3 秒的查询。
无论如何,现在我想逐个范围地执行这个查询。前 1000 行,1000-2000 等
我尝试了以下方法:
update Temp Tp
inner join
(
select Tp2.date
from Temp Tp2
inner join Today Ty2
on Tp2.url = Ty2.url
limit 1000
) Ty on Tp.url = Ty.url
set Tp.date = Ty.date
但我收到以下错误:#1054 - 'on clause'
中的未知列 'Ty.url'我找不到原因?
据我所知,这里有两个问题。首先,正如@pmbAustin 已经提到的,您在子查询中缺少一列。
其次,我认为您的子查询应该从 Ty2 而不是 Tp2 选择日期:
update Temp Tp
inner join
(
select Ty2.date, Tp2.url
from Temp Tp2
inner join Today Ty2
on Tp2.url = Ty2.url
limit 1000
) Ty on Tp.url = Ty.url
set Tp.date = Ty.date
参见SQLFiddle(尽管出于实际原因,此演示仅限于 2 个)。
虽然您没有特别询问过这个问题(您可能已经知道),但为了完整起见,应该提到对于后续查询,LIMIT
应该与 OFFSET
一起使用(或者只需使用快捷方式 LIMIT 1000, 1000
、LIMIT 2000,1000
、LIMIT <offset>, <limit>
等