2017-02-02 5 views
0

Я пытаюсь написать запрос mysql, в котором будут перечислены все сотрудники, их функция работы и общая стоимость всех заданий, которые они выполняли в течение определенного дня. Вот соответствующая часть моих таблиц:Сумма затрат MYSQL для всех сотрудников на определенную дату

job_function table 
emp_func 
emp_num 


employee table 
emp_name 
emp_num 

job table 
job_date 
emp_num 
job_name 

job_type table 
cost 
job_name 

Запрос работает за исключением того, что она возвращает только сотрудников, которые имели работу за определенный день. Если у сотрудника не было работы в тот день, они не появлялись. Мне нужно показать всех сотрудников, даже тех, у кого не было работы в тот день. Любые предложения о том, как это сделать? Вот мой запрос:

SELECT 
employee.emp_name, 
job_function,emp_func, 
SUM(job_type.cost) 
FROM 
employee 
INNER JOIN job ON job.emp_num = employee.emp_num 
INNER JOIN job_function ON job_function.emp_num = employee.emp_num 
INNER JOIN job_type ON job.job_name = job_type.job_name 
where job_date = '2016-04-16' 
group by emp_name; 
+0

вы должны найти свой ответ здесь. http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-full-join –

+0

Есть ли что-то еще, что мне нужно изменить, или это просто присоединиться? Я думал, что это может быть проблема присоединения, но я попробовал несколько других, и это не приблизило меня. «FULL OUTER JOIN», похоже, не работает с MYSQL, по крайней мере, не так, как я его использую. – user2328273

+0

Это также немного запутанно, поскольку я соединяю 4 таблицы вместо 2. – user2328273

ответ

0

Вам нужен left join, чтобы получить результаты, даже если в левой таблице нет строк, которые соответствуют состоянию on; значения в столбцах левых объединенных таблиц возвращаются как null в таких случаях.

Вам также необходимо переместить where -condition на on -condition; ваш where в противном случае потребовал бы даты в job -table, которая должна быть 2016-04-16, поэтому она должна существовать (и не быть null), что сделало бы left join снова поведением как join.

SELECT 
    employee.emp_name, 
    job_function.emp_func, 
    SUM(job_type.cost) 
FROM employee 
JOIN job_function ON job_function.emp_num = employee.emp_num 
left JOIN job ON job.emp_num = employee.emp_num and job.job_date = '2016-04-16'  
left JOIN job_type ON job.job_name = job_type.job_name 
group by employee.emp_name, job_function.emp_func; 

Я также фиксированной ваш group by и добавил emp_func -column там, так как вы выберите этот столбец. В противном случае это привело бы к ошибке в MySQL 5.7+ с настройками по умолчанию и в противном случае может привести к неправильным результатам в случаях, когда у сотрудника есть несколько функций.

+0

А, это очень полезно спасибо. Я не думал об использовании 'AND' в соединении. – user2328273

0

Если вы поставите job_date = '2016-04-16' вы можете увидеть только сотрудников, которые работают в этот день, вы должны удалить WHERE, чтобы увидеть список всех сотрудников или положить интервал как job_date>'2016-04-16' AND job_date<'2016-05-31'

+0

Правильно, но мне нужна дата. Я понимаю, что предложение 'where' исключает этих сотрудников, но мне нужно выяснить, как включить этих сотрудников и сохранить дату. Это так же близко, как я получил. Он должен показать ВСЕ сотрудников и общую стоимость их рабочих мест за этот день. Если в тот день нет работ для сотрудника, он должен показать сумму 0, вместо того чтобы не включать в себя сотрудника в целом. – user2328273

+0

Ничего себе, я думаю о вашей проблеме с 10 минут, не найдя решения, немного немного. –

+0

Lol, рад, что это не только я. – user2328273