एकल क्वेरी में एकाधिक चुनिंदा कथन


101

मैं php (mysql) में एक रिपोर्ट तैयार कर रहा हूं,

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

`select count(id) as tot_user from user_table
 select count(id) as tot_cat from cat_table
 select count(id) as tot_course from course_table`

इस तरह मेरे पास 12 टेबल हैं।

क्या मैं इसे सिंगल क्वेरी में बना सकता हूं। अगर मैंने किया? प्रक्रिया धीमी हो जाती है?


MyISAM तालिकाओं के लिए और भी बेहतर तरीका है, मेरा उत्तर देखें, जो तेज है।
पेंटियम

जवाबों:


246
SELECT  (
    SELECT COUNT(*)
    FROM   user_table
) AS tot_user,
(
    SELECT COUNT(*)
    FROM   cat_table
) AS tot_cat,
(
    SELECT COUNT(*)
    FROM   course_table
) AS tot_course

MyISAM तालिकाओं के लिए और भी बेहतर तरीका है, मेरा उत्तर देखें।
पेंटियम

4
"ऑपरेंड में 1 कॉलम (s) होना चाहिए" - केवल तभी जब आपके मर्ज किए गए टेबल कॉलम की गिनती में भिन्न हों। उन्हें मेल खाना चाहिए। इस उदाहरण में प्रति तालिका 1 कॉलम।
ज़ोन

5
यह केवल तभी काम करता है जब आप प्रत्येक उप-क्वेरी से एक ही आउटपुट लौटा रहे हों
प्राची

25

यदि आप MyISAM तालिकाओं का उपयोग करते हैं, तो सबसे तेज़ तरीका सीधे आँकड़ों की क्वेरी कर रहा है:

select table_name, table_rows 
     from information_schema.tables 
where 
     table_schema='databasename' and 
     table_name in ('user_table','cat_table','course_table')

यदि आपके पास InnoDB है तो आपको गणना () के साथ क्वेरी करना होगा क्योंकि सूचना में सूचना मान_schema.tables गलत है।



16

आप निश्चित रूप से बेन जेम्स द्वारा पोस्ट किए गए एक सेलेक्ट एग्रिगेशन स्टेटमेंट का चयन कर सकते हैं, हालांकि इसके परिणामस्वरूप आपके द्वारा टेबल के रूप में कई कॉलम होंगे। एक वैकल्पिक विधि इस प्रकार हो सकती है:

SELECT COUNT(user_table.id) AS TableCount,'user_table' AS TableSource FROM user_table
UNION SELECT COUNT(cat_table.id) AS TableCount,'cat_table' AS TableSource FROM cat_table
UNION SELECT COUNT(course_table.id) AS TableCount, 'course_table' AS TableSource From course_table;

इस तरह के एक दृष्टिकोण के बारे में अच्छी बात यह है कि आप स्पष्ट रूप से संघ के बयान लिख सकते हैं और एक मान उत्पन्न कर सकते हैं या मानों को रखने के लिए एक अस्थायी तालिका बना सकते हैं जो आपके टेबल नामों के स्थान पर चर का उपयोग करते हुए लगातार प्रोक कॉल्स से जोड़े जाते हैं। मैं बाद वाले के साथ अधिक जाना चाहता हूं, लेकिन यह वास्तव में व्यक्तिगत पसंद और आवेदन पर निर्भर करता है। यदि आप सुनिश्चित हैं कि तालिकाएँ कभी नहीं बदलेंगी, तो आप एकल पंक्ति प्रारूप में डेटा चाहते हैं, और आप तालिकाएँ नहीं जोड़ेंगे। बेन जेम्स के समाधान के साथ रहना। अन्यथा मैं लचीलेपन की सलाह दूंगा, आप हमेशा एक क्रॉस टैब स्ट्रच हैक कर सकते हैं।


11
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) =  ('10544175A') 
 UNION  
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) = ('10328189B') 
 UNION  
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) = ('103498732H')

12
इससे किस प्रश्न का उत्तर मिलता है?
ओलिव

1
यह मिगुएल Castaneda के UNION () समाधान और Pentium10 के INFORMATION_SCHEMA समाधान का एक संयोजन है। कृपया आपके द्वारा उपयोग किए जाने वाले उत्तरों का हवाला दें।
होल्डऑफ ह्यूंगर

2
SELECT t1.credit, 
       t2.debit 
FROM   (SELECT Sum(c.total_amount) AS credit 
        FROM   credit c 
        WHERE  c.status = "a") AS t1, 
       (SELECT Sum(d.total_amount) AS debit 
        FROM   debit d 
        WHERE  d.status = "a") AS t2 

1

मुझे पता है कि यह एक पुराना स्टैक है लेकिन मैं इस मल्टी-एसक्यूएल सेलेक्ट केस को पोस्ट करूंगा

    SELECT bp.bizid, bp.usrid, bp.website, 
ROUND((SELECT SUM(rating) FROM ratings WHERE bizid=bp.bizid)/(SELECT COUNT(*) FROM ratings WHERE bizid=bp.bizid), 1) AS 'ratings', 
(SELECT COUNT(*) FROM bzreviews WHERE bizid=bp.bizid) AS 'ttlreviews', 
bp.phoneno, als.bizname, 
(SELECT COUNT(*) FROM endorsment WHERE bizid=bp.bizid) AS 'endorses'
, als.imgname, bp.`location`, bp.`ownership`, 
(SELECT COUNT(*) FROM follows WHERE bizid=bp.bizid) AS 'followers', 
bp.categories, bp.openhours, bp.bizdecri FROM bizprofile AS bp 
INNER JOIN alluser AS als ON bp.usrid=als.userid 
WHERE als.usertype='Business'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.