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
提前致谢
答案 0 :(得分:18)
您的WHERE
条件会将OUTER JOIN
转换回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
答案 1 :(得分:1)
如果这些列stateID
,orderstateID
和OrderName
来自ORDERS
表,那么您将遇到问题。如您所见,如果places.placeID
表中没有orders
,则nulls
表的以下列为orders
。这就是为什么由于您在orders
表上提供的条件而无法显示某些记录的原因。
答案 2 :(得分:0)
你在说orderstateId = 1
。我想这会绑定到orders.orderstateId = 1
。对于空orderstateId
,此条件失败,这在左连接时不匹配时发生。
将其更改为orders.orderstateId = 1 OR orders.orderstateId IS NULL
答案 3 :(得分:0)
即使使用LEFT JOIN
,所有行都必须符合WHERE
子句中的条件。在这种情况下,WHERE
子句具有与orders
相关的要求,因此您不会返回orders
与places
不匹配的任何行。
一个简单的解决方法是允许空值满足WHERE
子句:
orderstateId = 1
更改为
(orderstateId is NULL or orderstateId = 1)
同样适用于其他变量。
这可能会做你想要的,但是你必须检查orders
表中是否包含空值的行,然后弄乱你的结果。以另一种方式重新设计查询可能会更好。