SQL Left join不显示左边的所有行

时间:2011-03-25 13:56:23

标签: mysql 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;

2 个答案:

答案 0 :(得分: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 :(得分:4)

首先,我相信你有一个错字 - statuses.service应该是services.name,对吗?

由于item是orders表中的一列,您应该将它放在连接条件中:

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)中没有的项目。

亲切的问候,弗兰克