【问题标题】:Duplicate data in LEFT Join mysql queryLEFT Join mysql查询中的重复数据
【发布时间】:2016-05-16 05:18:45
【问题描述】:

可能是重复的问题... 这里有两个表 tasks_0_tasks_stafftasks_0_staff_time_management

tasks_0_tasks_staff +----+----------+---------+ |编号 |任务ID |用户 ID | +----+----------+---------+ | 1 | 1 | 348 | | 2 | 1 | 350 | | 3 | 2 | 350 | | 4 | 2 | 351 | | 5 | 2 |第357章 +----+----------+---------+

tasks_0_staff_time_management +----+---------+---------+-------------+--------+ |编号 |用户 ID |任务ID | day_of_week |小时 | +----+---------+---------+-------------+--------+ | 1 | 350 | 1 | 2 | 2 | | 2 | 350 | 1 | 3 | 3 | +----+---------+---------+-------------+--------+

当我执行以下查询时,它在左连接表中显示重复数据...我如何显示 null(这是实际情况)...

选择 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 左加入`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` ; 结果: +---------+-------------+------+ |任务ID | day_of_week |小时 | +---------+-------------+------+ | 1 | 2 | 2 | | 1 | 3 | 3 | | 2 | 2 | 2 | | 2 | 3 | 3 | +---------+-------------+------+

为什么结果中的最后两行显示 day_of_weekhours 列值,因为左连接表中不存在这些值?这两行如何显示 NULL 值...?

我希望结果是这样的

+---------+-------------+------+ |任务ID | day_of_week |小时 | +---------+-------------+------+ | 1 | 2 | 2 | | 1 | 3 | 3 | | 2 |空 |空 | | 2 |空 |空 | +---------+-------------+------+

【问题讨论】:

  • 这看起来很适合我。我在这里看不到任何 NULL 值。
  • 使用 distinct 或 group by...
  • @PraveenKumar 我希望最后两行显示 day_of_week 和 hours 列的 NULL 数据...因为左连接表中没有匹配值...
  • 您不应该同时加入useridtaskid 吗?

标签: mysql join left-join


【解决方案1】:

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

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 = 2 的 NULL 值吗...我的意思是最后 2 行必须显示,但它在未找到的列中显示 NULL...
  • 你可以使用 FULL OUTER JOIN 或 FULL JOIN
【解决方案2】:

您应该在加入时添加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

【讨论】:

  • 在这一行: LEFT JOIN tasks_0_staff_time_management USING (task_id, user_id) ,这里引用了哪一列,task_0_tasks_staff 表的 task_id 和 user_id 表 OR tasks_0_staff_time_management 表?
  • 两者。当两个表共享相同的列名时,using 语法很方便。它是ON table_a.colname = table_b.colname 的简写。您可以列出任意数量的列。我的两个示例都是相同的 SQL,只是编写相同连接的不同方式。
【解决方案3】:

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

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

【讨论】:

  • 对不起,我无法抓住这个......mysql如何以及为什么插入重复数据......为什么不简单地将NULL作为......
  • 您的结果不重复。 task_id 列不同。
  • 我已经更新了问题...请参阅查询预期结果的最底部表格...对于 task_id=2,day_of_week 和 hours 列必须显示 NULL...但是mysql 显示重复数据,以防 task_id= 1 ...
  • 您正在进行笛卡尔连接,这意味着您没有使用适当的条件将记录匹配在一起。
  • 如果要包含不匹配的行,则需要使用外连接。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 2015-02-22
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多