Tek sorguda birden çok seçim ifadesi


102

Php (mysql) ile bir rapor oluşturuyorum,

ör .:

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

Bunun gibi 12 masam var.

Tek sorgu ile yapabilir miyim? Yapsaydım İşlem yavaşlıyor mu?


MyISAM tabloları için çok daha iyi bir yol var, cevabıma bakın, bu daha hızlı.
Pentium10

Yanıtlar:


247
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 tabloları için çok daha iyi bir yol var, cevabıma bakın.
Pentium10

4
"İşlenen 1 sütun içermelidir" - yalnızca birleştirilmiş tablolarınızın sütun sayısı farklıysa. Eşleşmeleri gerekir. Bu örnekte tablo başına 1 sütun.
Zon

5
bu yalnızca her alt sorgudan tek bir çıktı döndürdüğünüzde işe yarar
Prachi

25

MyISAM tablolarını kullanırsanız, en hızlı yol doğrudan istatistikleri sorgulamaktır:

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

InnoDB'ye sahipseniz, information_schema.tables'da bildirilen değer yanlış olduğundan count () ile sorgulamanız gerekir.



16

Kesinlikle, Ben James tarafından Postulated olarak bir Select Toplama ifadesini kullanabilirsiniz, Ancak Bu, tablolarınız olduğu kadar çok sayıda sütun içeren bir görünümle sonuçlanacaktır. Alternatif bir yöntem aşağıdaki gibi olabilir:

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;

Bunun gibi bir yaklaşımla ilgili güzel olan şey, açık bir şekilde Union deyimlerini yazıp bir görünüm oluşturabilmeniz veya tablo adlarınız yerine değişkenler kullanarak bir Proc cals'dan art arda eklenen değerleri tutmak için geçici bir tablo oluşturabilmenizdir. İkincisi ile daha çok gitme eğilimindeyim, ancak bu gerçekten kişisel tercihlere ve uygulamaya bağlı. Tabloların asla değişmeyeceğinden eminseniz, verileri tek satır biçiminde istersiniz ve tablo eklemeyeceksiniz. Ben James'in çözümüne sadık kalın. Aksi takdirde esnekliği tavsiye ederim, her zaman çapraz sekme yapısını kırabilirsiniz.


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
Bununla hangi soru cevaplanır?
Oliv

1
Bu Miguel Castaneda'nın UNION () çözümü ile Pentium10'un INFORMATION_SCHEMA çözümünün bir birleşimidir. Lütfen kullandığınız cevapları belirtin.
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

Bunun eski bir yığın olduğunu biliyorum ama bu Multi-SQL seçme durumunu göndereceğim

    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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.