使用左连接和MySQL IF语句创建PHP数组

时间:2016-06-15 13:34:18

标签: php mysql arrays join

这是我的问题

我们说我有这两个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.当然,MySQL中的IF语句应该检查并替换为' N'如果给定订单ID的付款表中没有记录。

OR

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

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
        ";