यदि स्तंभ मौजूद है या स्तंभ नहीं है तो सभी पंक्तियों का चयन कैसे करें


23

मैं एक स्क्रिप्ट लिख रहा हूं जिसमें कुछ तालिकाओं के लिए पंक्तियों की एक गिनती मिलती है, हालांकि कुछ तालिकाओं के लिए मैं केवल उन पंक्तियों की एक गिनती प्राप्त करना चाहता हूं जहां एक झंडा सेट है (इस मामले में सक्रिय = 1)। क्या कोई तरीका है कि मैं एक क्वेरी में ऐसा कर सकता हूं?

उदाहरण के लिए:

तालिका usersमें एक स्तंभ है जिसे सक्रिय कहा जाता है

तालिका में clientsसक्रिय नामक स्तंभ नहीं है

मैं उन उपयोगकर्ताओं की गिनती प्राप्त करना चाहता हूं जहां सक्रिय = 1 और सिर्फ ग्राहकों की गिनती हो।

इससे पहले कि आप "बस हार्ड कोड यह" कहते हैं कि यह एक क्वेरी है जो एक अजगर स्क्रिप्ट के अंदर जा रही है जिसे कई अलग-अलग डेटाबेसों पर चलाया जा सकता है और मुझे यह जानने का कोई तरीका नहीं है कि मेरी स्क्रिप्ट क्या तालिकाओं का चयन करेगी और यदि उनके पास एक कॉलम है active, और मैं दो अलग-अलग लोगों के बजाय यह सब करने के लिए सिर्फ एक क्वेरी करना पसंद करूंगा और एक त्रुटि को फेंकने के लिए mysql पर भरोसा करना चाहता हूं ताकि मैं दूसरे का उपयोग करना जानता हूं।


उपयोगकर्ता में एक क्लाइंट है जो क्लाइंट का संदर्भ देता है
मैट एस।

जवाबों:


50

मेरा पहला विचार पहले का उपयोग करना होगा INFORMATION_SCHEMA, इसलिए आपको पता है (MySQL उदाहरण में सभी तालिकाओं के लिए एक क्वेरी में) जिसमें तालिकाएँ एक activeस्तंभ हैं और फिर उस जानकारी का उपयोग करके अपने प्रश्नों का निर्माण करें। और यह शायद सबसे समझदार दृष्टिकोण है।

एक और दूसरा तरीका है, भले ही वह काम करता हो, भले ही मेज के पास ऐसा कॉलम हो या न हो:

SELECT 
  ( SELECT COUNT(*)
    FROM TableName AS t
    WHERE active = 1
  ) AS cnt
FROM
  ( SELECT 1 AS active
  ) AS dummy ;

SQL-Fiddle में परीक्षण किया गया कि यह कैसे काम करता है?

यदि तालिका में नाम का कॉलम है active, तो क्वेरी "अनुवादित" है जैसे कि यह था:

    WHERE t.active = 1

यदि तालिका में कोई स्तंभ नहीं है active, तो क्वेरी "अनुवादित" है जैसे कि यह था:

    WHERE dummy.active = 1         -- which is true 

3

केवल usersतालिका का उपयोग करके ग्रैंड कुल के साथ ग्राहकों की संख्या प्रति गणना :

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

यदि क्लाइंट टेबल ने रिकॉर्ड हटा दिए हैं, तो ऐसा करें:

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

उन usersतालिकाओं के लिए जिनमें एक activeकॉलम नहीं है :

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
GROUP BY u.id WITH ROLLUP;

या

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
GROUP BY u.id WITH ROLLUP;

आपको प्रत्येक डेटाबेस और UNION ALLपरिणामों के खिलाफ इन प्रश्नों को चलाने की आवश्यकता होगी ।

यदि आप INFORMATION_SCHEMA डेटाबेस का उपयोग करना चाहते हैं तो यहां एक जंगली अनुमान है:

SELECT COUNT(1) INTO @hasactive
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'users'
AND column_name = 'active';
SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE IF(@hasactive=1,u.active=1,1)=1
GROUP BY u.id WITH ROLLUP;

कोशिश तो करो !!!


1

मैं @ ypercube but के उत्तर को पूरक करना चाहूंगा, लेकिन मैं प्रतिबंधों के कारण टिप्पणियां नहीं लिख सकता।

यदि आपको नहीं पता है कि स्तंभ नाम का उपयोग क्या है, और आपको इसका अधिकतम मूल्य प्राप्त करने की आवश्यकता है, तो आप ऐसा कर सकते हैं:

SELECT
    ( SELECT
          max(ISNULL(updateTime, null)) + max(ISNULL(updDT, null))
          FROM tableName as t
    ) AS maxUpdateDT
FROM (SELECT 0 AS updateTime, 0 as updDT) AS dummy;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.