2015-09-28 3 views
1

У меня есть таблица «Temp» и таблица «Today» с теми же именами столбцов («url» и «date»).SQL Update + Inner Присоединиться к ряду строк

Я хочу обновить столбец «date» таблицы «Temp» при совпадении URL. Но мои таблицы довольно большие (30K элементов) и PHPMyAdmin не хочет выполнить следующий - справа - запрос:

update Temp Tp 
inner join Today Ty on 
    Tp.url = Ty.url 
set Tp.date = Ty.date 

Я получаю «выполнение запроса был прерван, ошибка # 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 - Неизвестный столбец 'Ty.url' в 'по статье'

Я не мог понять, почему?

+0

PS: Я использовал эту тему: http://stackoverflow.com/questions/20558649/mysql-update-join-with-limit писать второй запрос, но превышены пределы ... – Vincent

+0

Поскольку ваш подзапрос содержит только один столбец ... «Ty.date». Вам нужно добавить Ty.url в ваш оператор select. – pmbAustin

+0

Этот MySQL или SQL Server –

ответ

1

Насколько я вижу, здесь есть две проблемы. Во-первых, как уже упоминалось @pmbAustin, в вашем подзапросе отсутствует столбец.

Во-вторых, я думаю, что ваш подзапрос должен выбрать дату из TY2, а не ТР2:

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> и т.д.

+0

Спасибо! Но я все еще что-то пропустил: с «пределом 100» запрос занимает 1,5 секунды, но с «лимитом 20000, 2» у меня прерывание запросов ... Почему так много времени для двух строк?! – Vincent

+0

Чем выше смещение, тем дольше это нужно. Подробнее см. [Этот ответ] (http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down) и советы по повышению производительности. –

Смежные вопросы