Nhiều câu lệnh chọn trong một truy vấn


101

Tôi đang tạo một báo cáo bằng php (mysql),

Ví dụ:

`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`

Như thế này, tôi có 12 bảng.

Tôi có thể làm cho nó trong một truy vấn. Nếu tôi đã làm? Quá trình bị chậm?


Đối với bảng MyISAM thậm chí còn có một cách tốt hơn nhiều, hãy xem câu trả lời của tôi, cách này nhanh hơn.
Pentium10

Câu trả lời:


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

Đối với bảng MyISAM thậm chí còn có một cách tốt hơn nhiều, hãy xem câu trả lời của tôi.
Pentium10

4
"Toán hạng phải chứa 1 (các) cột" - chỉ khi các bảng đã hợp nhất của bạn khác nhau về số cột. Họ nên phù hợp. 1 cột trên mỗi bảng trong ví dụ này.
Zon

5
điều này chỉ hoạt động nếu bạn trả về một đầu ra duy nhất từ ​​mỗi truy vấn phụ
Prachi

25

Nếu bạn sử dụng bảng MyISAM, cách nhanh nhất là truy vấn trực tiếp số liệu thống kê:

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

Nếu bạn có InnoDB, bạn phải truy vấn với count () vì giá trị được báo cáo trong information_schema.tables là sai.


1
Trong trường hợp bạn đang thắc mắc, hãy xem thêm các câu trả lời này về sự khác biệt giữa MyISAM và InnoDB .
Paul Rougieux

16

Bạn chắc chắn có thể cho chúng tôi một câu lệnh Chọn tổ hợp như được Ben James đưa ra, Tuy nhiên Điều này sẽ dẫn đến một chế độ xem có nhiều cột như bạn có bảng. Một phương pháp thay thế có thể như sau:

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;

Điều thú vị về cách tiếp cận như thế này là bạn có thể viết rõ ràng các câu lệnh Union và tạo chế độ xem hoặc tạo bảng tạm thời để giữ các giá trị được thêm liên tiếp từ Proc cals bằng cách sử dụng các biến thay cho tên bảng của bạn. Tôi có xu hướng đi nhiều hơn với cái sau, nhưng nó thực sự phụ thuộc vào sở thích cá nhân và ứng dụng. Nếu bạn chắc chắn rằng các bảng sẽ không bao giờ thay đổi, bạn muốn dữ liệu ở một định dạng hàng duy nhất và bạn sẽ không thêm bảng. gắn bó với giải pháp của Ben James. Nếu không, tôi khuyên bạn nên linh hoạt, bạn luôn có thể hack một chuỗi tab chéo.


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
Câu hỏi nào được trả lời bởi điều này?
Oliv

1
Đây là sự kết hợp giữa giải pháp UNION () của Miguel Castaneda và giải pháp INFORMATION_SCHEMA của Pentium10. Vui lòng trích dẫn câu trả lời bạn sử dụng.
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

Tôi biết đây là một ngăn xếp cũ nhưng tôi sẽ đăng trường hợp chọn Multi-SQL này

    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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.