2016-06-15 66 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; 
     ";