2016-05-16 2 views
-2

может быть дубликатом вопрос ... здесь две таблицы tasks_0_tasks_staff и tasks_0_staff_time_management:Повторяющиеся данные в LEFT JOIN запросов MySQL

 
tasks_0_tasks_staff 

+----+---------+---------+ 
| id | task_id | user_id | 
+----+---------+---------+ 
| 1 |  1 |  348 | 
| 2 |  1 |  350 | 
| 3 |  2 |  350 | 
| 4 |  2 |  351 | 
| 5 |  2 |  357 | 
+----+---------+---------+ 

и

 
tasks_0_staff_time_management 
+----+---------+---------+-------------+-------+ 
| id | user_id | task_id | day_of_week | hours | 
+----+---------+---------+-------------+-------+ 
| 1 |  350 |  1 |   2 |  2 | 
| 2 |  350 |  1 |   3 |  3 | 
+----+---------+---------+-------------+-------+ 

, когда я выполнить следующие запрос показывает повторяющиеся данные в таблице левого соединения ... как я могу показать null (что является фактическим случаем) ...

 
SELECT tasks_0_tasks_staff.`task_id`, 
tasks_0_staff_time_management.day_of_week, 
tasks_0_staff_time_management.hours 

FROM tasks_0_tasks_staff 

LEFT JOIN `tasks_0_staff_time_management` ON `tasks_0_staff_time_management`.`user_id`= `tasks_0_tasks_staff`.`user_id` 

WHERE `tasks_0_tasks_staff`.`user_id`= 350 

ORDER BY `tasks_0_tasks_staff`.`task_id` ; 

results: 
+---------+-------------+-------+ 
| task_id | day_of_week | hours | 
+---------+-------------+-------+ 
|  1 |   2 |  2 | 
|  1 |   3 |  3 | 
|  2 |   2 |  2 | 
|  2 |   3 |  3 | 
+---------+-------------+-------+ 

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

я жду результатов, чтобы быть как этот

 
+---------+-------------+-------+ 
| task_id | day_of_week | hours | 
+---------+-------------+-------+ 
|  1 |   2 |  2 | 
|  1 |   3 |  3 | 
|  2 |  NULL | NULL | 
|  2 |  NULL | NULL | 
+---------+-------------+-------+ 
+1

Это выглядит идеально подходит для меня. Здесь я не вижу никаких значений NULL. –

+1

использовать отличную или группу по ... – Kunal

+0

@PraveenKumar im ожидает, что последние две строки отображают данные NULL для day_of_week и столбца часов ... поскольку в левой объединенной таблице нет соответствующих значений ... – mhk

ответ

1

Вы должны добавить task_id в качестве условия на вашем присоединиться:

SELECT tasks_0_tasks_staff.`task_id`, 
    tasks_0_staff_time_management.day_of_week, 
    tasks_0_staff_time_management.hours 
FROM tasks_0_tasks_staff 
LEFT JOIN `tasks_0_staff_time_management` ON `tasks_0_staff_time_management`.`user_id`= `tasks_0_tasks_staff`.`user_id` AND `tasks_0_staff_time_management`.`task_id`= `tasks_0_tasks_staff`.`task_id` 
WHERE `tasks_0_tasks_staff`.`user_id`= 350 
ORDER BY `tasks_0_tasks_staff`.`task_id` ; 

или с некоторыми более семантического SQL:

SELECT tasks_0_tasks_staff.`task_id`, 
    tasks_0_staff_time_management.day_of_week, 
    tasks_0_staff_time_management.hours 
FROM tasks_0_tasks_staff 
LEFT JOIN `tasks_0_staff_time_management` USING (`task_id`, `user_id`) 
WHERE `tasks_0_tasks_staff`.`user_id`= 350 
ORDER BY `tasks_0_tasks_staff`.`task_id` ; 

Вот немного доказательство концепции SQL скрипкой:

http://sqlfiddle.com/#!9/2a2425/1

+0

в этой строке: LEFT JOIN 'tasks_0_staff_time_management' USING (' task_id', 'task_id',' user_id'), в каком столбце указывается здесь, task_id и user_id таблицы tasks_0_tasks_staff или таблицы tasks_0_staff_time_management? – mhk

+1

Оба. Синтаксис 'use' удобен, когда обе таблицы имеют одинаковое имя столбца. Это сокращенно для 'ON table_a.colname = table_b.colname'. Вы можете указать столько столбцов, сколько хотите. Оба моих примера - один и тот же SQL, просто другой способ записи того же соединения. – Scopey

1

Вам нужно добавить условие в вашем где так, что он соответствует только записи с одинаковым TASK_ID.

Обратите внимание, что повторяющиеся результаты означают, что разные родственные строки идентичны, то есть не ваш случай.

+0

извините, я не могу захватить это ... как и почему mysql вставляет повторяющиеся данные ... почему бы просто не положить NULL как ... – mhk

+0

Ваши результаты не дублируются. Столбец task_id отличается. –

+0

Я обновил вопрос ... обратитесь к нижней таблице ожидаемых результатов запроса ... для task_id = 2, столбец day_of_week и hours должен показывать NULL ... но mysql показывает дублированные данные, как в case for task_id = 1 ... – mhk

0

Для этого вы должны использовать «INNER JOIN».

SELECT tasks_0_tasks_staff.`task_id`, 
tasks_0_staff_time_management.day_of_week, 
tasks_0_staff_time_management.hours 

FROM tasks_0_tasks_staff 

INNER JOIN `tasks_0_staff_time_management` ON `tasks_0_staff_time_management`.`user_id`= `tasks_0_tasks_staff`.`user_id` 

WHERE `tasks_0_tasks_staff`.`user_id`= 350 

ORDER BY `tasks_0_tasks_staff`.`task_id` ; 
+0

такие же результаты ... не работает ... – mhk

2

Вы должны изменить свой код, как этот

SELECT tasks_0_tasks_staff.`task_id`, 
tasks_0_staff_time_management.day_of_week, 
tasks_0_staff_time_management.hours 

FROM tasks_0_tasks_staff 

LEFT JOIN `tasks_0_staff_time_management` ON `tasks_0_staff_time_management`.`user_id`= `tasks_0_tasks_staff`.`user_id` 

WHERE `tasks_0_tasks_staff`.`user_id`= 350 AND `tasks_0_tasks_staff`.`task_id` = tasks_0_staff_time_management.`task_id` 

ORDER BY `tasks_0_tasks_staff`.`task_id` ; 
+0

Yup .. он решил проблему ... – mhk

+0

, но только для любопытства ... могу ли я получить значение NULL для task_id = 2 ... i означает, что последние две строки должны показать, но они показывают NULL в не найденных столбцах ... – mhk

+0

Вы можете использовать FULL OUTER JOIN или FULL JOIN –