1

我的数据库中有两张表 - 产品和订单。一个订单只能是一种产品。

这是基本思想:

在此处输入图像描述

我正在尝试做的是一个查询,给定一个 copmany_id 返回所有订单少于 10 个(包括 0 个)的产品(来自该公司)

我的查询如下所示:

SELECT p.*
FROM   product p,
       order o
WHERE  p.company_id =?
       AND o.product_id = p.id
GROUP  BY p.id
HAVING Count(o.id) < 10
ORDER  BY p.id DESC

该查询适用于具有 0 < 订单但不返回具有 0 订单的产品。我还需要做什么才能退回它们?

4

2 回答 2

1

你是INNER JOINING你的两张桌子,这意味着只有那些至少有一个订单的产品才会被退回。您将需要LEFT OUTER JOIN订单表:

SELECT p.*
FROM   product p
       LEFT OUTER JOIN order o
                    ON o.product_id = p.id
WHERE  p.company_id = ?
GROUP  BY p.id
HAVING Count(o.id) < 10
ORDER  BY p.id DESC  

JOIN左外连接将至少返回操作左侧的每条记录一次,无论操作右侧是否有匹配的记录JOIN

于 2012-08-20T08:53:05.540 回答
1

尝试左外连接

SELECT p.*
FROM   product p
       LEFT OUTER JOIN order o
                    ON o.product_id = p.id
WHERE  p.company_id =?
GROUP  BY p.id
HAVING Count(o.id) < 10
ORDER  BY p.id DESC

有关左外连接,请参见此示例

于 2012-08-20T08:53:10.717 回答