#php #mysql #database #codeigniter
#php #mysql #База данных #codeigniter — инициализатор кода
Вопрос:
У меня есть три стола. Имя таблицы — это
- salary_history_table — employee_id(foreignkey)
- employee_table — идентификатор employee_id(основной) department_structure_id(иностранный)
- department_table — department_structure_id(основной)
Теперь таблица salary_history_table имеет идентификатор с именем «employee_id», который является первичным ключом в employee_table. И у employee_table есть идентификатор с именем «department_structured_id», который является первичным ключом в department_table, моя проблема в том, что я хочу обновить все данные в столбце salary_history_table с именем rate_exempt на основе «department_structured_id» из department_table. Как я могу присоединиться к трем таблицам и обновить все, что связано с конкретной базой запросов id, в employee_id?
Комментарии:
1. что вы пробовали? Как будут выглядеть образцы данных до и после? Отредактируйте вопрос, чтобы включить эти детали.
Ответ №1:
Это просто, не так уж и сложно. Просто используйте приведенный ниже запрос, хорошо, позвольте мне рассказать вам, как это работает, сначала вы должны вызвать таблицу, которая имеет оба значения, здесь я вызываю ее get()
, как только вы получили оба идентификатора, тогда вы можете присоединиться к другой таблице с этими идентификаторами.
$this->db->join('salary_history_table', 'salary_history_table.employee_id = employee_table.employee_id', 'left');
$this->db->join('department_table', 'department_table.department_structure_id = employee_table.department_structure_id', 'left');
$this->db->get('employee_table');
Дайте мне знать, если у вас все еще есть какие-либо проблемы.
Ответ №2:
Во-первых, полезно нарисовать таблицы и их отношения (я сократил имена, чтобы печатать на своем телефоне)
salary_history employee department
employee_id —-> employee_id
rate_exempt department_id ——> department_id
Итак, если вы хотите перечислить историю зарплат всех сотрудников всех отделов,
select s.*
from department d
inner join employee e on e.department_id = d.department_id
inner join salary_history s on s.employee.id = e.employee.id
Но для вашего вопроса вам даже не нужно объединять все три таблицы, если вы знаете department_id
select s.*
from salary_history s
inner join employee e on e.employee_id = s.employee_id
where e.department_id = ?
Но если вы не знаете идентификатор отдела, и вам нужно сопоставить его, скажем, по названию отдела
select s.*
from salary_history s
inner join employee e on e.employee_id = s.employee_id
inner join department d on d.department_id = e.department_id
where d.name = ?
Используя это, вы можете настроить свое обновление. Синтаксис, по-видимому, различается в разных системах БД, поэтому вам нужно будет посмотреть, что работает для вас
update salary s
inner join employee e on e.employee_id=s.employee_id
inner join department d on d.department_id=e.department_id
set rate_exempt = ?
where d.name=?
or,
update ...
set...
inner join
inner join
where
or,
update salary
set rate_exempt = ?
where employee_id in (
select e.employee_id
from employee e
inner join department d on d.department_id=e.department_id
where d.name = ?
)