12

LEFT JOIN 应该显示左表上的所有行,但是在运行以下查询时,我只获得计数为 1 或更多的位置值。请有人给我一些关于我可能出错的地方的指导:

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
WHERE  places.companyId = 1
       AND stateId = 1
       AND orderstateId = 1
       AND orderName NOT LIKE 'Delivery%'
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 

提前致谢

4

4 回答 4

27

您的WHERE条件将OUTER JOINback 转换为INNER JOIN.

不匹配的行将包含NULL所有orders列并被WHERE子句消除。尝试这个。

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
       AND orders.stateId = 1
       AND orders.orderstateId = 1
       AND orders.orderName NOT LIKE 'Delivery%'
WHERE  places.companyId = 1
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 
于 2012-10-01T14:41:01.673 回答
1

即使使用 a LEFT JOIN,所有行也必须满足WHERE子句中的条件。在这种情况下,该WHERE子句具有与 相关的要求orders,因此您不会返回任何orders与 不匹配的行places

一个简单的解决方法是允许空值满足您的WHERE子句:

orderstateId = 1

更改为

(orderstateId is NULL or orderstateId = 1)

对于其他变量也是如此。

这可能会满足您的要求,但您必须检查是否orders可以包含表中具有空值的行并弄乱您的结果。以另一种方式重新设计查询可能会更好。

于 2012-10-01T14:35:04.667 回答
1

如果这些列stateIDorderstateIDOrderName来自ORDERS表,那么您将遇到问题。如您所见,如果表places.placeID上不存在orders,则以下列为nullsorders。这就是为什么某些记录不会显示的原因,因为您在orders桌子上提供的条件。

于 2012-10-01T14:28:15.407 回答
0

你在说orderstateId = 1。我想这绑定到orders.orderstateId = 1. orderstateId当左连接没有匹配时发生的空值,此条件失败。

将其更改为orders.orderstateId = 1 OR orders.orderstateId IS NULL

于 2012-10-01T14:27:35.133 回答