Мне нужна помощь в сложных запросах phpmysql

#php #mysql #database #codeigniter

#php #mysql #База данных #codeigniter — инициализатор кода

Вопрос:

У меня есть три стола. Имя таблицы — это

  1. salary_history_table — employee_id(foreignkey)
  2. employee_table — идентификатор employee_id(основной) department_structure_id(иностранный)
  3. 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 = ?
    )