คำสั่งเลือกหลายรายการในแบบสอบถามเดียว


105

ฉันกำลังสร้างรายงานใน 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 มีวิธีที่ดีกว่ามากดูคำตอบของฉันซึ่งเร็วกว่า
Pentium10

คำตอบ:


251
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 มีวิธีที่ดีกว่านี้อีกมากดูคำตอบของฉัน
Pentium10

4
"โอเปอแรนด์ควรมี 1 คอลัมน์" - เฉพาะในกรณีที่ตารางที่ผสานของคุณแตกต่างกันในจำนวนคอลัมน์ ควรตรงกัน 1 คอลัมน์ต่อตารางในตัวอย่างนี้
Zon

5
สิ่งนี้ใช้ได้เฉพาะเมื่อคุณส่งคืนผลลัพธ์เดียวจากแบบสอบถามย่อยแต่ละรายการ
Prachi

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 คุณต้องค้นหาด้วย count () เนื่องจากค่าที่รายงานใน information_schema.tables ไม่ถูกต้อง



16

คุณสามารถใช้คำสั่ง Select Agregation ตามที่ Ben James โพสต์ไว้ได้อย่างแน่นอนอย่างไรก็ตามสิ่งนี้จะส่งผลให้มีมุมมองที่มีคอลัมน์มากที่สุดเท่าที่คุณมีตาราง วิธีอื่นอาจเป็นดังนี้:

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;

สิ่งที่ดีเกี่ยวกับการอนุมัติเช่นนี้คือคุณสามารถเขียนคำสั่ง Union อย่างชัดเจนและสร้างมุมมองหรือสร้างตารางชั่วคราวเพื่อเก็บค่าที่เพิ่มตามลำดับจาก Proc cals โดยใช้ตัวแปรแทนชื่อตารางของคุณ ฉันมักจะไปมากกว่านี้ แต่จริงๆแล้วมันขึ้นอยู่กับความชอบส่วนบุคคลและการใช้งาน หากคุณแน่ใจว่าตารางจะไม่เปลี่ยนแปลงคุณต้องการให้ข้อมูลอยู่ในรูปแบบแถวเดียวและคุณจะไม่ต้องเพิ่มตาราง ใช้วิธีแก้ปัญหาของ Ben James มิฉะนั้นฉันจะแนะนำให้มีความยืดหยุ่นคุณสามารถแฮ็กโครงสร้างข้ามแท็บได้ตลอดเวลา


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
คำถามอะไรที่ตอบได้จากสิ่งนี้?
Oliv

1
นี่เป็นการรวมกันของโซลูชัน UNION () ของ Miguel Castaneda และโซลูชัน INFORMATION_SCHEMA ของ Pentium10 โปรดอ้างอิงคำตอบที่คุณใช้
HoldOffHunger

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

ฉันรู้ว่านี่เป็นสแต็กเก่า แต่ฉันจะโพสต์กรณีเลือก Multi-SQL นี้

    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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.