2016-05-16 84 views
-2

可能是重複的問題... 這裏有兩個表tasks_0_tasks_stafftasks_0_staff_time_management重複數據加入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 | 
+----+---------+---------+-------------+-------+ 

當我執行以下查詢它顯示左連接表中的重複數據...我如何顯示空(這是實際的情況下)...

 
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我期待最後兩行顯示空白數據爲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',' user_id'),哪個列在這裏被引用,task_0_tasks_staff表的task_id和user_id或者是tasks_0_staff_time_management表? – mhk

+1

兩者。當兩個表共享相同的列名時,'using'語法非常方便。它是'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

是的..它解決了這個問題... – mhk

+0

但只是好奇...我可以得到NULL值爲task_id = 2 ...我的意思是最後2行必須顯示,但在未找到列中顯示NULL ... – mhk

+0

您可以在此行上使用FULL OUTER JOIN或FULL JOIN –