LEFT Join mysql 查询中的重复数据
Duplicate data in LEFT Join mysql query
可能是一个重复的问题...
这里有两个 tables tasks_0_tasks_staff 和 tasks_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_week 和 hours 列值,因为它们不存在于离开加入 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:
可能是一个重复的问题... 这里有两个 tables tasks_0_tasks_staff 和 tasks_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_week 和 hours 列值,因为它们不存在于离开加入 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: