2011-03-25 45 views
0

顯示所有的行,以便concered我的兩個表的大致結構如下:SQL LEFT JOIN不是從左邊

Table one: Services 
services.id 
services.name 

Table two: Orders 
orders.id 
orders.item 
orders.service 

表一個包含服務的列表。而表二是訂單清單。我試圖從表2(訂單)生成所有服務訂單的列表,但還包括(零)尚未訂購的服務。我知道這就是LEFT JOIN來的地方,但它似乎根本不起作用。它顯示大部分服務,但有一個或兩個記錄(來自服務)不被顯示。這裏是我目前使用的查詢..

任何指導都非常感謝,謝謝!

select services.name,count(orders.service) 
from services 
LEFT JOIN orders ON services.id=orders.service 
WHERE item IN (1,2,3,4) 
group by statuses.service; 

回答

5

您原來的選擇是好的,應該允許服務表中的所有記錄通過。然而,你然後通過你的where條款來限制這一點。如果某個特定行沒有加入,item將在其中有一個NULL,您的WHERE子句將被過濾掉。

SELECT services.name 
    ,COUNT(orders.service) 
FROM services 
LEFT JOIN orders ON services.id = orders.service 
WHERE item IS NULL 
    OR item IN (1, 2, 3, 4) 
GROUP BY statuses.service; 

請原諒我,如果有點不對,我來自SQL Server後臺。

+1

或許,這將是更好的IN子句移動到連接條件:'ON services.id = orders.service以及標記(...)' – 2011-03-25 14:04:21

+0

它更有意義把它放在連接條件,因爲在那裏項目爲空...導致錯誤的計數(它也計算項目不在(1,2,3,4)) – 2011-03-25 14:08:08

+0

盡我所知這個http:// www。 wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html例子中的左連接mysql也可以帶空值。所以寫作「是空的」不是我想要的。 – Bastardo 2011-03-25 14:10:04

4

首先,我相信你有一個錯字 - statuses.service應該是services.name,對不對?

由於產品從訂單表中的列,你應該把它的連接條件:

select services.name,count(orders.service) 
from services 
LEFT JOIN orders ON services.id=orders.service and services.item IN (1,2,3,4) 
group by statuses.service; 

否則,你過濾掉沒有訂單的服務或者其訂單隻有未在上述(1, 2,3,4)。

親切的問候,弗蘭克

+0

顯然更明智! – 2011-03-25 14:09:35