powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обновление данных из трех таблиц!
9 сообщений из 9, страница 1 из 1
Обновление данных из трех таблиц!
    #39721199
xxx-lu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро!
Сломал голову себе, целый день вчера потратил на решение. В итоге так и не победил.
Может подскажите, может все гораздо проще и я что-то упустил? :)

И так, имеется три таблицы:
1 - таблица сотрудников ( users ), в которой указан также "ID должности" ( id,position_id )
2 - таблица должностей соответственно ( positions ), с полями id,position
3 - таблица ( xls ) в которую поступают актуальные данные из *.xls файла, в которой также содержится столбец "Должности" Но не "ID должности", а именно "Название должности" ( position ).

Так вот, задача в следующем!
нужно из таблицы xls обновить таблицу сотрудников ( users ), точнее их должности (если не совпадают), НО! т.к. в тбл. xls идет "Название должности" ( position - varchar()), а в тбл. users "ID должности" ( position_id int()), требуется сравнить сначала:

xls . position с positions . position и затем position . id сравнить с users . position_id .

SELECT запрос я сделал - работает ! А вот как его преобразовать в UPDATE - не могу сообразить!
по сути проблема у меня только во вложенном селекте, который выводит новую должность.

SELECT u.id,(SELECT id FROM positions WHERE position=x.position LIMIT 1) AS position_id
FROM users AS u LEFT JOIN xls AS x ON u.id=x.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>x.position

Выводит 4 строки (правильно, у 4х сотрудников сменилась должность): id сотрудника и новая должность

также работает этот UPDATE, НО нужно вместо цифры(33) подставить как то вот это (SELECT id FROM positions WHERE position=x.position LIMIT 1)
UPDATE users AS u
INNER JOIN(
select u.id FROM users AS u LEFT JOIN xls AS x ON u.id=x.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>x.position
) AS result USING(id)
SET position_id=33 Сдесь должен быть (SELECT id FROM positions WHERE position=x.position LIMIT 1)
WHERE u.id=result.id
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721211
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите DDL всех трёх таблиц, пример их содержимого, и результат на именно этих данных.
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721305
xxx-lu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `users` (
  `id` int(5) NOT NULL AUTO_INCREMENT COMMENT 'ИД пользователя',
  `surname` varchar(19) NOT NULL DEFAULT 'Иванов' COMMENT 'Фамилия',
  `name` varchar(20) NOT NULL DEFAULT 'Иван' COMMENT 'Имя',
  `patronymic` varchar(16) NOT NULL DEFAULT 'Иванович' COMMENT 'Отчество',
  `birthday` date DEFAULT NULL COMMENT 'Дата рождения',
  `position_id` int(2) DEFAULT '1' COMMENT 'Должность',
  `work_id` int(3) DEFAULT NULL,
  `cab_id` int(2) DEFAULT '1',
  `type_id` int(2) DEFAULT '2',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `users` VALUES (1,'Уланова','Анна','Сергеевна','1991-07-27',2,NULL,1,2),(2,'Петров','Николай','Васильевич','1951-10-05',33,NULL,1,2),(3,'Олежкин','Владимир','Анатолевич','1958-07-03',14,NULL,1,2),(4,'Иванов','Андрей','Михайлович','1968-08-21',59,NULL,1,2),(5,'Синицина','Инна','Владимировна','1988-10-11',1,NULL,1,2),(6,'Сидоренко','Юлия','Ивановна','1983-01-08',29,NULL,1,2),(7,'Носков','Юрий','Андреевич','1973-08-25',44,NULL,1,2);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `positions` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `position` varchar(80) DEFAULT NULL COMMENT 'Должность',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `positions` VALUES (1,'Бухгалтер'),(2,'Бухгалтер-кассир'),(9,'Водитель автомобиля'),(14,'Делопроизводитель'),(21,'Инженер МТС'),(29,'Кладовщик'),(30,'Механик автотранспорта'),(33,'Начальник отдела'),(44,'Слесарь по ремонту автомобилей'),(59,'Экономист');


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `xls` (
  `id` int(5) NOT NULL AUTO_INCREMENT COMMENT 'ИД пользователя',
  `surname` varchar(19) NOT NULL DEFAULT 'Иванов' COMMENT 'Фамилия',
  `name` varchar(20) NOT NULL DEFAULT 'Иван' COMMENT 'Имя',
  `patronymic` varchar(16) NOT NULL DEFAULT 'Иванович' COMMENT 'Отчество',
  `birthday` date DEFAULT NULL COMMENT 'Дата рождения',
  `position` varchar(80) DEFAULT NULL COMMENT 'Должность',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `xls` VALUES (1,'Уланова','Анна','Сергеевна','1991-07-27','Бухгалтер'),(3,'Олежкин','Владимир','Анатолевич','1958-07-03','Делопроизводитель'),(4,'Иванов','Андрей','Михайлович','1968-08-21','Экономист'),(5,'Синицина','Инна','Владимировна','1988-10-11','Начальник отдела'),(6,'Сидоренко','Юлия','Ивановна','1983-01-08','Бухгалтер-кассир'),(7,'Носков','Юрий','Андреевич','1973-08-25','Кладовщик');



Код: plsql
1.
2.
SELECT u.id,u.surname,u.name,p.position AS 'старая должность',p.id AS old_id,(SELECT position FROM positions WHERE position=e.position LIMIT 1) AS 'Новая должность',(SELECT id FROM positions WHERE position=e.position LIMIT 1) AS new_id
FROM users AS u LEFT JOIN xls AS e ON u.id=e.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>e.position



НУЖЕН UPDATE
Код: plsql
1.
2.
3.
4.
5.
6.
UPDATE users AS u
INNER JOIN(
select u.id FROM users AS u LEFT JOIN xls AS x ON u.id=x.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>x.position
) AS result USING(id)
SET position_id=Здесь должен быть (SELECT id FROM positions WHERE position=x.position LIMIT 1)
WHERE u.id=result.id
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721320
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE users u, positions p, xls x
SET u.position_id = p.id
WHERE u.surname = x.surname
  AND u.name = x.name
  AND u.patronymic = x.patronymic
  AND u.birthday = x.birthday
  AND x.position = p.position
-- AND u.position_id != p.id


fiddle
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721358
xxx-lu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Огромнейшее Вам спасибо!!!
Все работает :)
Не особо хорошо понимаю в сложных UPDATE'х, но вы все расставили по своим местам ;)

PS: Последняя закоментная строчка, я так понимаю, что будет обновлять только те строки, которые не совпадают?
И по поводу сравнения строк, можно же сделать сравнения только по id ? в Моем случае id привязаны к сотрудникам (табельный номер) и совпадают у сотрудников в обеих таблицах
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xxx-luПоследняя закоментная строчка, я так понимаю, что будет обновлять только те строки, которые не совпадают?Ну в реальности оно по-любому так будет (rows matched !== rows affected)... но последняя строка, если её раскомментировать, уменьшит количество попыток обновления.
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721379
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xxx-luможно же сделать сравнения только по id ?Да пожалуйста... будет только WHERE users.id = xls.id. С точки зрения нормализации это даже где-то правильно...
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721407
xxx-lu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaxxx-luможно же сделать сравнения только по id ?Да пожалуйста... будет только WHERE users.id = xls.id. С точки зрения нормализации это даже где-то правильно...
:)
Хочу еще обновлять фамилии сотрудников с одним ID, ведь женщинам свойственно их менять :)
Интересно, что будет быстрее работать, да и в целом как грамотнее (правильнее):
Один запрос на обновление всех записей
Код: plsql
1.
2.
3.
UPDATE users u, positions p, xls x
SET u.position_id = p.id, u.surname = x.surname
WHERE u.id = x.id AND x.position = p.position


ЛИБО два разных запроса, но именно по отличающимся данным
Код: plsql
1.
2.
3.
4.
5.
UPDATE users u, positions p, xls x
SET u.position_id = p.id
WHERE u.id = x.id
        AND x.position = p.position
        AND AND u.position_id != p.id

И
Код: plsql
1.
2.
3.
UPDATE users u, xls x
SET u.surname = x.surname
WHERE u.id = x.id AND u.surname != x.surname
...
Рейтинг: 0 / 0
Обновление данных из трех таблиц!
    #39721436
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один запрос, вне всякого сомнения, лучше. И хрен с ими, что совпадают... всё равно проверка на совпадение - будет, и какая разница, будет это в секции отбора, или уже при обновлении при принятии решения, надо записывать блок на диск, или он фактически не изменился...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обновление данных из трех таблиц!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]