Обновление нескольких строк в таблице, после выборки из другой

Awax

Новичок
Обновление нескольких строк в таблице, после выборки из другой

Добрый день!
Не нашел на форуме похожей темы, поэтому создал эту.

Имеется 2 таблицы:

table pcompany
------
id
company


table people
------
id
name
company
id_comp

--------------
Нужно во 2-й таблице обновить поле id_comp(пока пустое).
Раньше таблицы связывались по полю "company", но т.к. название компании может смениться,
нужно будет связь установить через id_comp.
вот так я просматриваю похожие строки в обоих таблицах

SELECT pc.id as id_comp, pc.company, p.id as id_people ,p.company, p.name, p.id_comp FROM pcompany as pc, people as p
WHERE pc.company=p.company order by pc.id

Т.е. во 2-й таблице значение поля id_comp соответствовало id из первой таблицы при совпадении названия компании.
немного получилось сумбурно но думаю понятно.
Каким как правильно сделать Update 2-й таблицы для поля id_comp?
 

iceman

говнокодер
PHP:
update tableA as a
  set a.field = (select b.field from tableB as b where b.field = >>>a.field<<< );
 

Awax

Новичок
Автор оригинала: iceman
PHP:
update tableA as a
  set a.field = (select b.field from tableB as b where b.field = >>>a.field<<< );
Да, чтото я сразу не догадался.
Хм, после прогона вот такого запроса
PHP:
update people as p set p.id_comp =(select pc.id from pcompany as pc, people as p where pc.company=p.company)
обновляются первые 30-40 записей и MySql выдает такую ошибку
You can't target table 'people' for update in FROM clause

Почему не может обновить все записи сразу?
 

zerkms

TDD infected
Команда форума
Awax
потому что нельзя модифицировать таблицу, из которой читаешь.
 

Awax

Новичок
т.е. нужно создать временную таблицу и уже из нее сделать Update или как то по другому?
 

zerkms

TDD infected
Команда форума
Awax
не нужно никаких временных таблиц, нужно понимать, что ты делаешь. запрос от товарища iceman имел смысл, а твой - бессмысленный.
 

Awax

Новичок
Автор оригинала: zerkms
Awax
не нужно никаких временных таблиц, нужно понимать, что ты делаешь. запрос от товарища iceman имел смысл, а твой - бессмысленный.
Я уже понял что бессмысленный, сам проверил.
но если
вот таким запросом который предлагал iceman
PHP:
update people set id_comp=(select id from pcompany where pcompany.company=people.company)
он уже обновляет 150 записей и выдает ошибку
Subquery return more than 1 row

Что ему еще не хватает?

PS. в таблице people 828 записей
pcompany 840 записей
 

Awax

Новичок
Я уже перевел и в курсе что под запрос возвращает более одной строки. Это то понятно, там же select.
Почему обновилось только 150 строк из 840-а?

Как все же обновить все строки, изменить запрос?
 

zerkms

TDD infected
Команда форума
Я уже перевел и в курсе что под запрос возвращает более одной строки. Это то понятно, там же select.
какая глупость.

SELECT там должен возвращать по одному значению.

set id_comp=(тут одно значение)

Потому что одно значение в id_comp записать можно, а много - нельзя. Разве это неочевидно?

Ну и чтобы закрепить:
У тебя в таблице pcompany существует как минимум один наобор записей с неуникальным company.

-~{}~ 13.10.10 16:04:

На закуску код, который покажет тебе эти неуникальные записи

Код:
  SELECT GROUP_CONCAT(id),
         company
    FROM pcompany
GROUP BY company
  HAVING COUNT(*) > 1
 

iceman

говнокодер
Awax
вот ты говоришь что хочешь добавить comp_id
ID - идентификатор - по своей сути он уникален в пределах области идентификации

ты хочешь старый ИДЕНТИФИКАТОР (да, был текстовый, и он тоже должен был быть уникальным! ) стал новым, числовым.

либо добейся уникальности, либо исключи из запроса те поля которые не уникальны, а потом вручную (либо запросом) поменяешь на нужную цифру
 

Awax

Новичок
Да, неправильно понял.
проверил на уникальность, действительно пару строк вывалилось, т.к. БД тестовая пользователи уже успели нашлепать дубли(тогда еще не успел сделать проверку уже на созданные записи).
После все прошло нормально. записи нормально обновились.
Спасибо.
 

iceman

говнокодер
Awax
из за этого дубля у тебя программа работала не верно, а ты даже не замечал...
 
Сверху