我试图从mysql查询中获取null
或0
值,但我得到的结果并不是我想要的。我确定我甚至没有使用正确的查询来解决这个问题。
这是一个显示我正在使用的数据的平方英尺。
http://sqlfiddle.com/#!2/e7c5198/1
我需要返回所有带有相应值的Product_ID
个数字。作为value
或null
。
这是我的疑问......
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`
这是我得到的......
这就是我想要回来的......
红色是我在原始查询中遗漏的内容。
我试图在不使用php的循环的情况下这样做。如果有人有任何想法,请指出我正确的方向!
好的,这是一个新的小提琴.. http://sqlfiddle.com/#!2/0db52/2
我已根据建议尝试简化查询,但我仍然缺少我需要的详细信息。我可能需要完全改变我的查询以获得我想要的东西。但我还是不确定我做错了什么。如果看到第二张图像,则表示红线。这些是我想在结果中返回的行。我希望将此作为单个mysql查询而不是在php中使用循环。
答案 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`