2014-12-13 2 views
3

Его немного сложнее, поэтому я расскажу немного медленно, просто не буду вдаваться в проблему.ошибочные результаты при объединении в разных таблицах

У меня есть база данных Схема регистрации сотрудников, Эти работники назначены для работы с точки зрения проекта.

1 сотрудник может работать на многих рабочих мест, е-г сотрудника John находится на projectabc на задаче 123 снова сотрудник John также на projectabc но на задаче 789

456 задача назначить кого-то другого. но это еще одна проблема.

поэтому у нас есть Джон, работающий над тем же проектом для разных задач, из которых у меня есть две записи в моей таблице assign_job.

См. Изображение в маленькой схеме ниже. enter image description here

Эта схема в порядке. проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу иметь таблицы времени. Итак, я добавил две таблицы для расписания времени.

, к которой новая схема будет ниже enter image description here

Я добавил некоторые пустышки Записи двух новых таблиц для двух проектов, которые перечислены ниже.

  1. Recruitment & Выбор
  2. Обучение & Развития

для проекта 1 я добавил 31 записей означает на каждый день есть некоторое время работал сотрудник сделал. , но для проекта 2 сотрудник работал только 1 день.

Теперь я запустил этот запрос, который Я думаю, что это неправильный способ создания объединений в этой ситуации. cuz из которых я отправляю этот вопрос, так как получаю неправильные результаты для данных в базе данных.

SELECT 
TS.`date_created` AS TimeSheetMonth, 
TSD.`project_id` AS ProjectID, 
TSD.`date` AS WorkDate, 
TSD.`hours` AS WorkHours, 
TS.`employee_id` AS EmployeeID, 
E.`full_name` AS EmployeeName, 
MLP.`project_title` AS ProjectTitle, 
TS.`id` AS TimeSheetID 
FROM timesheet TS 
INNER JOIN timesheet_details TSD 
ON TS.`id`= TSD.`timesheet_id` 
INNER JOIN employee E 
ON E.`employee_id` = TS.`employee_id` 
INNER JOIN assign_job AJ 
ON AJ.`employee_id` = E.`employee_id` AND AJ.`trashed` = 0 
INNER JOIN ml_projects MLP 
ON AJ.`project_id` = MLP.`project_id` 
INNER JOIN ml_projects TMLP 
ON TMLP.`project_id` = TSD.`project_id` 
WHERE TS.`id`=1 
GROUP BY TSD.`timesheetDetails_id`, TSD.`project_id` 

Как вы можете видеть на скриншоте ниже, я получаю название проекта для проекта ID 1, где, как я получаю 2 как Project ID .. Может быть есть еще вопросы. скажите, что это я делаю неправильно в этих объединениях?

enter image description here

============================

Update

SQLFIDDLELINK: нажмите на заголовок или копию снизу.

http://sqlfiddle.com/#!2/dc4585/1 

=========================== Я хочу, чтобы отдельные записи, как я хочу, чтобы показать его в таблице выглядеть ниже одного.

enter image description here

+1

поддерживается только для усилий, которые вы приложили, чтобы ваш вопрос выглядел хорошо! – Konstantin

+0

Удалите 'AND AJ.trashed = 0' и напишите его в where where. Также вместо AND AJ.'trashed' = 0 используйте 'AND AJ.employee_id = TS.employee_id'. Также присоединяются к AJ.project_id и TSD.project_id отсутствует. И ваша группа имеет TSD.timesheetDetails_id', но не в выборе? – SMA

+0

Я не уверен, почему вам нужно дважды присоединиться к ml_project, а затем использовать разные столбцы из этих двух таблиц? Я считаю, что в этом случае это не нужно. Fiish, что диаграмма отношений, и это упростит ситуацию – Konstantin

ответ

1

Ваш timesheet стол или что-то хочешь, чтобы назвать его, нужно только один внешний ключ - job_id, ссылающийся на assign_job_id и время, затраченное на это назначение. И никаких ключей для employee_id или project_id, потому что у assign_job уже есть эта информация. Я не хочу писать код для вас, потому что я вижу, что вы можете сделать это сами.

Вы присоединяетесь к своему расписанию, чтобы назначить_job и присоединиться к этому сотруднику и проекту - вуаля. Затем вы можете группировать работник или/или по проекту или/или задаче. это все там

+0

Thankyou. Кажется, ты прав. не думал об этом, я напрямую обращался к проектам, которые создавали проблему для меня .. Отправляйся сюда после внесения необходимых изменений .. –

+0

Спасибо - с диаграммой, которую вы сделали, легко определить, где вы были не уверен, что делать. Все запросы просто путают картину, которая стоит 100 слов :) – Konstantin

1

Попробуйте это так;

SELECT 
    TSD.`project_id` AS ProjectID, 
    TSD.`date` AS WorkDate, 
    TSD.`hours` AS WorkHours, 
    TS.`date_created` AS TimeSheetMonth, 
    TS.`employee_id` AS EmployeeID, 
    TS.`id` AS TimeSheetID, 
    E.`full_name` AS EmployeeName, 
    MLP.`project_title` AS ProjectTitle 
FROM 
    timesheet TS 
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id` 
    INNER JOIN employee E ON E.`employee_id` = TS.`employee_id` 
    INNER JOIN assign_job AJ ON AJ.`employee_id` = E.`employee_id` 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id` 
    -- INNER JOIN ml_projects TMLP ON TMLP.`project_id` = TSD.`project_id` -- what for? 
WHERE 
    TS.`id`=1 
    AND AJ.`trashed` = 0 
GROUP BY 
    TSD.`timesheetDetails_id`, TSD.`project_id` 
+0

im получение ошибки сэр. 'Код ошибки: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «E._full_name' AS EmployeeName, MLP.'project_title' AS ProjectTitle FROM 'в строке 8' –

+0

Benni, ваш код выглядит великолепно, Мне жаль, что каждому не понадобится время, чтобы он выглядел так. Поскольку запрос OPs почти не читается - в чем разница, кроме AJ.trashed в where clause? и отсутствующая запятая после TS.'id' AS TimeSheetID – Konstantin

+0

это была проблема синтаксиса. вы забыли запятую после TimeSheetID, поэтому я получил синтаксическую ошибку и добавила дополнительную запятую после ProjectTitle в разделе Select Statement. Плюс тот же результат, который я получаю сейчас. ничего не изменилось .. :( –

1

ли вам просто нужно что-то вроде этого:

SELECT 
    concat(TS.`employee_id`, " - ", E.`full_name`) as employee, 
    concat(TSD.`project_id`, " - ", MLP.`project_title`) as Project, 
    TS.`date_created` AS TimeSheetMonth, 
    sum(1) as WorkDaysOnProjectInMonth, 
    sum(TSD.`hours`) AS WorkHoursOnProjectInMonth 

FROM 
    timesheet TS 
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id` 
    INNER JOIN employee E ON E.`employee_id` = TS.`employee_id` 
    INNER JOIN assign_job AJ ON AJ.`employee_id` = E.`employee_id` 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id` 
WHERE 
    TS.`id`=1 
    AND AJ.`trashed` = 0 
GROUP BY 
     1,2 

EDIT

Вау, сложный вопрос! Но я думаю, что это решит вашу проблему:

SELECT 
    aj.PROJECT_ID,AJ.`employee_id`, 
    mlp.project_title, 
    e.full_name, 
    TS.id, 
    TSD.date, TSD.hours 

FROM 
    assign_job AJ 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id` -- P:1 
    INNER JOIN employee E ON AJ.`employee_id` = E.`employee_id` 
    INNER JOIN timesheet TS ON E.`employee_id` = TS.`employee_id` 
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id` 

WHERE 
    TS.`id`=1 
    AND AJ.`trashed` = 0 
+0

Спасибо за усилие. но я хочу индивидуальный результат за каждый час, так как я хочу отображать запись каждого часа на столе. –

+0

обновил скриншот, в котором я показал таблицу, в которой хочу заполнить запись. –

+0

Вы перепутали порядок соединения. См. Мой обновленный ответ ... – Benvorth