LEFT Join mysql 查询中的重复数据

Duplicate data in LEFT Join mysql query

可能是一个重复的问题... 这里有两个 tables tasks_0_tasks_stafftasks_0_staff_time_management:

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 |
+----+---------+---------+-------------+-------+

当我执行以下查询时,它在左连接中显示重复数据 table...我如何显示 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_weekhours 列值,因为它们不存在于离开加入 table?这两行如何显示 NULL 值...?

我期待这样的结果

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

您需要在您的 where 中添加一个条件,以便它只匹配具有相同 task_id.

的记录

请注意,重复的结果意味着不同的相关行是相同的,不是你的情况。

你应该使用 "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` ;

你必须像这样更改你的代码

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` ;

您应该添加 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 fiddle:

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