这是我的问题
我们说我有这两个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中执行此操作。需要避免这种情况,因为这将是一个高流量的功能。
由于
答案 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;
";