使用LEFT JOIN未获得具有空值的预期结果

时间:2014-05-28 17:35:04

标签: mysql left-join

我试图从mysql查询中获取null0值,但我得到的结果并不是我想要的。我确定我甚至没有使用正确的查询来解决这个问题。

这是一个显示我正在使用的数据的平方英尺。

http://sqlfiddle.com/#!2/e7c5198/1

我需要返回所有带有相应值的Product_ID个数字。作为valuenull。 这是我的疑问......

SELECT
`apl`.`Product_ID` PID,
`apl`.`Carries` Crs,
`apl`.`Approved` APV,
`o`.`Customer_ID` CID,
`oln`.`ProductName`,
`oln`.`Product_ID` PID ,
`Distributor_Name` DNAME,
sum(`oln`.`qty`) as tqty,
count(distinct(`o`.`Order_ID`)) as OdWith,
max(`o`.`OrderPlaceServerTime`) as LastOrder

FROM `Orders` `o`
JOIN `Customers` `c` ON `c`.`Customer_ID` = `o`.`Customer_ID`
JOIN `CustomerDetails` `cd` ON `cd`.`Customer_ID` = `o`.`Customer_ID`
JOIN `_Distributors` `d` ON `d`.`Distributor_ID` = `cd`.`Distributor_ID`

LEFT JOIN `Order_LineDetails` `oln` ON `oln`.`Order_ID` = `o`.`Order_ID`
  AND (
    `oln`.`Product_ID` = "2872" OR
    `oln`.`Product_ID` = "3032" OR
    `oln`.`Product_ID` = "3043" OR
    `oln`.`Product_ID` = "3419" OR
    `oln`.`Product_ID` = "3613" OR
    `oln`.`Product_ID` = "3614" OR
    `oln`.`Product_ID` = "3671" OR
    `oln`.`Product_ID` = "3672" 
      )

LEFT JOIN `APL_LIST` `apl` ON `apl`.`Customer_ID` =  `o`.`Customer_ID` AND `apl`.`Product_ID` = `oln`.`Product_ID`

WHERE `o`.`OrderPlaceServerTime` > DATE_SUB(now(), INTERVAL 1 YEAR)
AND `o`.`Customer_ID` = 6614
AND `oln`.`Product_ID` = `apl`.`Product_ID`
AND `o`.`IsVOID` = 0
GROUP BY `oln`.`Product_ID`
ORDER BY `oln`.`Product_ID`, `LastOrder`

这是我得到的......

enter image description here

这就是我想要回来的......

enter image description here

红色是我在原始查询中遗漏的内容。

我试图在不使用php的循环的情况下这样做。如果有人有任何想法,请指出我正确的方向!

修改

好的,这是一个新的小提琴.. http://sqlfiddle.com/#!2/0db52/2

我已根据建议尝试简化查询,但我仍然缺少我需要的详细信息。我可能需要完全改变我的查询以获得我想要的东西。但我还是不确定我做错了什么。如果看到第二张图像,则表示红线。这些是我想在结果中返回的行。我希望将此作为单个mysql查询而不是在php中使用循环。

2 个答案:

答案 0 :(得分:0)

正如VMai所指出的那样,问题是你在WHERE - 条款中有这个位:

AND `oln`.`Product_ID` = `apl`.`Product_ID`

只有连接到apl的记录成功,才能满足此条件,因此LEFT JOIN无效。

要解决此问题,您可以将该子句移到ON子句中。 (或者,你可以简单地删除它;从表名等判断,我猜你在ON子句中已有的就足够了吗?)

答案 1 :(得分:0)

尝试下面的查询,因为在您上次加入时您已经提到了条件

`apl`.`Product_ID` = `oln`.`Product_ID

我已将其从WHERE条件中移除。请在此处查看您的更新小提琴http://sqlfiddle.com/#!2/e7c5198/13

SELECT
`apl`.`Product_ID` PID,
`apl`.`Carries` Crs,
`apl`.`Approved` APV,
`o`.`Customer_ID` CID,
`oln`.`ProductName`,
`oln`.`Product_ID` PID ,
`Distributor_Name` DNAME,
sum(`oln`.`qty`) as tqty,
count(distinct(`o`.`Order_ID`)) as OdWith,
max(`o`.`OrderPlaceServerTime`) as LastOrder
FROM `Orders` `o`
LEFT JOIN `Customers` `c` 
ON `c`.`Customer_ID` = `o`.`Customer_ID`

LEFT JOIN `CustomerDetails` `cd` 
ON `cd`.`Customer_ID` = `o`.`Customer_ID`

LEFT JOIN `_Distributors` `d` 
ON `d`.`Distributor_ID` = `cd`.`Distributor_ID`

LEFT JOIN `Order_LineDetails` `oln` 
ON `oln`.`Order_ID` = `o`.`Order_ID`
  AND 
    `oln`.`Product_ID` in 
('2872','3032','3043','3419','3613','3614','3671','3672')

LEFT JOIN `APL_LIST` `apl` 
ON `apl`.`Customer_ID` =  `o`.`Customer_ID` 
AND `apl`.`Product_ID` = `oln`.`Product_ID`

WHERE `o`.`OrderPlaceServerTime` > 
DATE_SUB(now(), INTERVAL 1 YEAR)
AND `o`.`Customer_ID` = '6614'
AND `o`.`IsVOID` = 0

GROUP BY `oln`.`Product_ID`
ORDER BY `oln`.`Product_ID`, `LastOrder`