Как из одной таблицы скопировать ID в другую таблицу при условии совпадения поля NAME

12
FFFFx029A
На сайте с 01.09.2007
Offline
142
2724

Всем доброго времени суток, вот понадобилось разбить базу, помогите составить MYSQL запрос, нужно из одной таблицы скопировать ID в другую таблицу при условии совпадения поля NAME.

Пример таблицы в которой только уникальные имена

abonent_table
-------------------
id
name

и вторая таблица где имена могут повторятся и real_id там пустое:

access_table
-------------------
id
name
real_id

собственно нужно одним запросом записать нужные ID абонентов из таблицы abonent_table в поля real_id в access_table имея имя абонента (поле name).

Заранее спасибо, думаю многим будет полезно занть)

---------- Добавлено 20.02.2013 в 07:28 ----------

Делаю так:

UPDATE `abonent_table`,`access_table` SET `access_table`.`real_id`=`abonent_table`.`id` WHERE `access_table`.`name`=`abonent_table`.`name`

и так

UPDATE `access_table` SET `real_id` = (SELECT `id` FROM `abonent_table` where `access_table`.`real_name`=`abonent_table`.`name` IS NOT NULL LIMIT 30)

Но так как записей больше 2 лямов, то это дело все виснит, а если добавить в первом варианте LIMIT 100 например то выскакивает ошибка. Походу что-то не так делаю? Может есть более гуманный способ?

http://www.youtube.com/watch?v=Gyl4E4EcPdc (http://www.youtube.com/watch?v=Gyl4E4EcPdc) - партнёрка от Мавроди и МММ))) http://miniwm.ru/soft.php?read=917 (http://miniwm.ru/soft.php?read=917) CMS MiniWM v2.8 - 49.99$
дани мапов
На сайте с 06.09.2012
Offline
204
#1

Попробуйте так


UPDATE `abonent_table` SET `access_table`.`real_id` = `abonent_table`.`id` WHERE `access_table`.`name`=`abonent_table`.`name`
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
FFFFx029A
На сайте с 01.09.2007
Offline
142
#2
дани мапов:
Попробуйте так

UPDATE `abonent_table` SET `access_table`.`real_id` = `abonent_table`.`id` WHERE `access_table`.`name`=`abonent_table`.`name`

в таком случае выдает Unknown column `access_table` in 'where clause'

а если сделать UPDATE `abonent_table`,`access_table` SET `access_table`.`real_id` = `abonent_table`.`id` WHERE `access_table`.`name`=`abonent_table`.`name`

то оно долго думает и я даже не могу сказать результат, запускаю запросы через SSH

Мож както LIMIT можно привязать и заодно проверку AND `access_table`.`real_id`='0' LIMIT 500000 ? прост если в тупую дописать там какаято ошибка "ERROR 1221 (HY000): Incorrect usage of UPDATE and LIMIT"

Буду пока пробывать дописать AND `access_table`.`real_id`='0' AND `access_table`.`real_id`<'50' но хз прокатит ли такое, запустил что-то долго тупит(((

siv1987
На сайте с 02.04.2009
Offline
427
#3

UPDATE access_table ac LEFT JOIN abonent_table ab ON ab.name=ac.name SET ac.real_id=ab.id

UPDATE access_table ac, abonent_table ab SET ac.real_id=ab.id WHERE ac.name=ab.name LIMIT 100

на поля ac.name и ab.name должны стоять индексы. Ну если записей много то ждите, мгновенно такой запрос конечно не выполнится.

FFFFx029A
На сайте с 01.09.2007
Offline
142
#4
siv1987:
UPDATE access_table ac LEFT JOIN abonent_table ab ON ab.name=ac.name SET ac.real_id=ab.id

UPDATE access_table ac, abonent_table ab SET ac.real_id=ab.id WHERE ac.name=ab.name LIMIT 100

на поля ac.name и ab.name должны стоять индексы. Ну если записей много то ждите, мгновенно такой запрос конечно не выполнится.

Спасибо, думаю протестю на днях ибо на текущем хосте это все унриал, виснит весь серв даже когда индекс пытаюсь вставить(

FFFFx029A
На сайте с 01.09.2007
Offline
142
#5
siv1987:
UPDATE access_table ac LEFT JOIN abonent_table ab ON ab.name=ac.name SET ac.real_id=ab.id

UPDATE access_table ac, abonent_table ab SET ac.real_id=ab.id WHERE ac.name=ab.name LIMIT 100

на поля ac.name и ab.name должны стоять индексы. Ну если записей много то ждите, мгновенно такой запрос конечно не выполнится.

Первый вариант выдает ошибку что-то типа use near ляляля, а во втором варианте LIMIT не работает, ну а без LIMIT сложновато за раз все обработать(((

siv1987
На сайте с 02.04.2009
Offline
427
#6
FFFFx029A:
Первый вариант выдает ошибку что-то типа use near ляляля

Значит поправьте где выдает ошибку, возможно я где-то ошибся в названия полей.

FFFFx029A:
а во втором варианте LIMIT не работает, ну а без LIMIT сложновато за раз все обработать(

UPDATE access_table ac INNER JOIN abonent_table ab ON ab.name=ac.name SET ac.real_id=ab.id WHERE ac.id>0 AND ac.id<10000;

Еще раз повторяю - на поля ac.name и ab.name должны стоять индексы.

FFFFx029A
На сайте с 01.09.2007
Offline
142
#7
siv1987:
Значит поправьте где выдает ошибку, возможно я где-то ошибся в названия полей.



UPDATE access_table ac INNER JOIN abonent_table ab ON ab.name=ac.name SET ac.real_id=ab.id WHERE ac.id>0 AND ac.id<10000;


Еще раз повторяю - на поля ac.name и ab.name должны стоять индексы.

Индексы стоят на все поля и названия все правильно написаны, всеравно выдает ошибку что неправильный синтаксис. Кстате, если ON это условие, то WHERE потом тоже можно использовать или? Пытался то что в WHERE запихнуть в ON - всеравно ошибка синтаксиса вылазит(

siv1987
На сайте с 02.04.2009
Offline
427
#8

Ошибку в студию.

FFFFx029A
На сайте с 01.09.2007
Offline
142
#9
siv1987:
Ошибку в студию.

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'abonent_table ab ON ab.name=ac.name SET ac.id=ab.id WHERE ac.id&gt;0 AND ac.id&lt;' at line 1

P.S запускал через phpMyAdmin

siv1987
На сайте с 02.04.2009
Offline
427
#10
SET ac.id=ab.id

Точно не ac.real_id?

FFFFx029A:
ac.id&gt;0 AND ac.id&lt;

P.S запускал через phpMyAdmin

Запускайте из ssh

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий