एक टेबल है जहां चालान के लिए भुगतान डेटा दर्ज किया जाता है। मैं चालान की कुल भुगतान राशि की गणना करने के लिए एसयूएम का उपयोग कर रहा हूं। मैं केवल उन चालानों को दिखाना चाहता हूं जिनका भुगतान नहीं किया गया है। इसलिए मैंने GROUP BY का उपयोग करके WHERE क्लॉज बनाया और केवल उन रिकॉर्ड्स को दिखाने के लिए जिनमें कुल चालान राशि से कम के रिकॉर्ड हैं।

लेकिन...यदि भुगतान तालिका में खोजने के लिए कोई रिकॉर्ड नहीं हैं, तो सिस्टम प्रदर्शित करने के लिए कोई चालान नहीं ढूंढ सकता है। क्या किसी और का भी यही मसला था? मैं एक अलग प्रारूप में बदलने के लिए तैयार हूं, लेकिन मुझे इसे उसी तरह से कार्य करने की आवश्यकता है जहां इसे केवल कुल चालान राशि से कम भुगतान राशि वाले चालान मिलते हैं या कोई भुगतान नहीं होता है।

$query = "
SELECT o.id, o.user_id,o.invoice_number,o.total,SUM(p.payment_amount) as paid 
FROM User_Order_Details as o 
LEFT JOIN User_Payments as p ON (p.user_id = o.user_id AND p.order_id = o.id) 
WHERE o.user_id = '1' AND o.invoice_number != '' 
GROUP BY p.order_id 
HAVING SUM(p.payment_amount) < o.total 
ORDER BY o.ship_date DESC
");
0
Web Pro Source 1 अप्रैल 2020, 06:28

1 उत्तर

सबसे बढ़िया उत्तर

आपकी समस्या यह है कि जब कोई भुगतान नहीं किया गया है, तो SUM(p.payment_amount) NULL है, और NULL की तुलना किसी भी चीज़ से करने पर हमेशा FALSE (इसलिए HAVING SUM(p.payment_amount) < o.total का परिणाम नहीं होता है। उन पंक्तियों को वापस करें)। तो आपको उस मान को 0 में बदलने के लिए COALESCE का उपयोग करने की आवश्यकता है, जिसकी तब सफलतापूर्वक तुलना की जा सकती है। ध्यान दें कि MySQL आपको HAVING क्लॉज में उपनामों का उपयोग करने की अनुमति देता है, इसलिए आप वहां केवल paid का उपयोग कर सकते हैं:

$query = "
SELECT o.id, o.user_id,o.invoice_number,o.total, COALESCE(SUM(p.payment_amount),0) as paid 
FROM User_Order_Details as o 
LEFT JOIN User_Payments as p ON (p.user_id = o.user_id AND p.order_id = o.id) 
WHERE o.user_id = '1' AND o.invoice_number != '' 
GROUP BY p.order_id 
HAVING paid < o.total 
ORDER BY o.ship_date DESC
");
1
Nick 1 अप्रैल 2020, 03:42