Beberapa pernyataan pilih dalam satu kueri

101

Saya membuat laporan di php (mysql),

ex:

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

Seperti ini saya punya 12 tabel.

Bisakah saya membuatnya dalam satu kueri. Jika iya? Proses menjadi lambat?

bos
sumber
Untuk tabel MyISAM bahkan ada cara yang jauh lebih baik, lihat jawaban saya, yang lebih cepat.
Pentium10

Jawaban:

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
sathish
sumber
Untuk tabel MyISAM bahkan ada cara yang jauh lebih baik, lihat jawaban saya.
Pentium10
4
"Operand harus berisi 1 kolom" - hanya jika tabel gabungan Anda berbeda dalam jumlah kolom. Mereka harus cocok. 1 kolom per tabel dalam contoh ini.
Zon
5
ini hanya berfungsi jika Anda mengembalikan satu output dari setiap sub-kueri
Prachi
25

Jika Anda menggunakan tabel MyISAM, cara tercepat adalah menanyakan statistik secara langsung:

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

Jika Anda memiliki InnoDB, Anda harus melakukan kueri dengan count () karena nilai yang dilaporkan di information_schema.tables salah.

Pentium10
sumber
1
Jika Anda bertanya-tanya, lihat juga jawaban ini tentang perbedaan antara MyISAM dan InnoDB .
Paul Rougieux
16

Anda pasti dapat menggunakan pernyataan Pilih Agregasi seperti yang didalilkan oleh Ben James, Namun ini akan menghasilkan tampilan dengan kolom sebanyak Anda memiliki tabel. Metode alternatifnya mungkin sebagai berikut:

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;

Hal yang menyenangkan tentang pendekatan seperti ini adalah Anda dapat secara eksplisit menulis pernyataan Union dan menghasilkan tampilan atau membuat tabel temp untuk menampung nilai yang ditambahkan secara berurutan dari Proc cals menggunakan variabel sebagai pengganti nama tabel Anda. Saya cenderung lebih memilih yang terakhir, tetapi itu sangat tergantung pada preferensi dan aplikasi pribadi. Jika Anda yakin tabel tidak akan pernah berubah, Anda menginginkan data dalam format baris tunggal, dan Anda tidak akan menambahkan tabel. tetap berpegang pada solusi Ben James. Jika tidak, saya menyarankan fleksibilitas, Anda selalu dapat meretas lintas tab.

Miguel Castaneda
sumber
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')
net.tunneler
sumber
12
Pertanyaan apa yang dijawab oleh ini?
Oliv
1
Ini adalah kombinasi solusi UNION () Miguel Castaneda dan solusi INFORMATION_SCHEMA Pentium10. Harap kutip jawaban yang Anda gunakan.
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 
Mani
sumber
1

Saya tahu ini adalah tumpukan lama tetapi saya akan memposting kasus pilih Multi-SQL ini

    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'
Niclausel
sumber