mysql - IN मूल्य के लिए डिफ़ॉल्ट परिणाम की परवाह किए बिना




(2)

मेरे पास एक क्वेरी है जो सभी उपयोगकर्ता को मिलती है जो एक निश्चित तिथि सीमा के बीच ऑनलाइन हैं। यह एक इन-क्वेरी के माध्यम से किया जाता है कि मैं डेटा कैसे प्रदर्शित करना चाहता हूं। हालाँकि, मैं डिफ़ॉल्ट मान वापस करना चाहूंगा यदि कोई आईडी उस स्थिति के लिए दर्ज नहीं की गई थी जिसे IN स्थिति में पार्स किया गया था।

सरलीकृत क्वेरी:

SELECT users.Name, users.ID, SUM(users.Minutes) AS MinutesOnline
     FROM UserTable
     LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
     WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
     AND UserTable.ID IN(332,554,5764,11,556,.........)
     GROUP BY users.ID
     ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)

अब उपरोक्त क्वेरी केवल उन पंक्ति में खींचेगी जो अपेक्षा के अनुसार शर्त को पूरा करती हैं। मैं इस शर्त के भीतर आईडी के लिए एक डिफ़ॉल्ट मान में खींचने के लिए क्वेरी भी चाहूंगा जो शर्त को पूरा नहीं करता है।

इस उदाहरण में IFNULL का उपयोग करने से काम नहीं चलेगा क्योंकि रिकॉर्ड कभी वापस नहीं आता है

SELECT users.Name, users.ID, IFNULL(SUM(users.Minutes), 0) AS MinutesOnline
     FROM UserTable
     LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
     WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
     AND UserTable.ID IN(332,554,5764,11,556,.........)
     GROUP BY users.ID
     ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)

FYI करें - मैं इस क्वेरी को एक कस्टम PDO फ़ंक्शन में पार्स कर रहा हूं। मैं पदावनत mysql कार्यों का उपयोग नहीं कर रहा हूँ


आपके पास OnlineUseage पर एक शर्त है कि लेफ्ट जॉइन इनर जॉइन की तरह हो जाए।

अपनी स्थिति को खण्ड from स्थानांतरित करना बेहतर होगा:

SELECT
    users.Name,
    users.ID,
    IFNULL(SUM(users.Minutes), 0) AS MinutesOnline
FROM
    users
    LEFT JOIN OnlineUseage ON
        OnlineUseage.ID = users.ID and
        OnlineUseage.Date >= '2016-01-01 00:00:00' AND
        OnlineUseage.Date <= '2016-12-31 23:59:59'
WHERE
    users.ID IN (332,554,5764,11,556,.........)
GROUP BY
    users.ID,users.Name
ORDER BY
    users.ID

जब आप LEFT JOIN उपयोग करते हैं तो आपको दूसरी तालिका पर शर्तों को ON क्लॉज में रखना होगा। उन्हें WHERE क्लॉज में डालने से उन सभी पंक्तियों को फ़िल्टर किया जा सकता है जिनमें मिलान नहीं है, क्योंकि वे कॉलम NULL और स्थितियां कभी भी सफल नहीं होंगी।

SELECT users.Name, users.ID, IFNULL(SUM(OnlineUseage.Minutes), 0) AS MinutesOnline
FROM UserTable
LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
    AND OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
WHERE UserTable.ID IN(332,554,5764,11,556,.........)
GROUP BY UserTable.ID
ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)




sql