2016-06-15 43 views
1

这里是我的问题使用LEFT JOIN创建一个PHP数组和MySQL IF语句

比方说,我有两个MySQL表

Orders 
CustID, OrderID, OrderDetails1, OrderDetails2, .. 
1, 101, Item1, Item2, ... 
1, 102, Item1, Item2, ... 
1, 103, Item1, Item2, ... 
2, 104, Item1, Item2, ... 
2, 105, Item1, Item2, ... 
.... and so on 

Payments 
OrderID, Paid 
101, Y 
105, Y 
.... and so on 

现在我想的是包含了所有的订单(每个客户一个数组)用柱付费Y或N

Array => { 
(CustID=1, OrderID=101, Paid=Y), 
(CustID=1, OrderID=102, Paid=N), 
(CustID=1, OrderID=103, Paid=N) } 

我当前SQL是

SELECT o.CustID, o.OrderID, if(p.Paid='Y','Y','N') as Paid 
FROM Orders o left JOIN Payments p USING(CustID) 
WHERE o.CustID = 123456 
AND o.CustID=p.CustID 
Group by o.OrderID 
Order by o.OrderID; 

问题是上面的SQL对Array中的所有行返回Y.如果在给定OrderID的Payments表中没有记录,那么MySQL中的IF语句当然应该检查并替换为'N'。

我是否必须在PHP中分两步执行此操作。需要避免这一点,因为这将是一个高流量的功能。

感谢

+1

删除'AND o.CustID = p.CustID',使得您的左连接自然连接 – Jens

回答

2

我不理解的连接条件USING(CustID)。所示的Payments表不显示CustID列。

在WHERE子句中,此条件o.CustID=p.CustID只有在非NULL值CustID时才会满足。这就抵消了连接的“外部性”,使其等同于内部连接。

而且包含GROUP BY子句很奇怪。其他数据库会抛出一个错误(沿着“在SELECT列表中非聚集”的行)

只需修复您的查询。

SELECT o.CustID 
     , o.OrderID 
     , IF(p.Paid='Y','Y','N') AS Paid 
    FROM Orders o 
    LEFT 
    JOIN Payments p 
     ON p.OrderID = o.OrderID 
     AND p.CustID = o.CustID  -- ? is OrderID not unique 
    WHERE o.CustID = 123456 
    ORDER BY o.OrderID 
+0

谢谢,工作。 USING(CustID)是应该使用的错字(OrderID) – Rocketman

0

我不知道你真的有一个问题是什么,但你应该考虑使用一个类似的代码,以帮助您与您的查询,此代码应显示所有支付与ID 123456,如果你想你可以使用相同的代码和chage'Y'到“N”来显示所有没有支付的。

"SELECT 
     Orders .*, 
     Payments .* 
     FROM 
     tbl_Orders , tblinterviews 
     WHERE 
     Orders .CustID = 123456 AND Payments .CustID=Orders .CustID AND Orders .Paid='Y' 
     Group by Orders .OrderID 
    Order by Orders .OrderID; 
     ";