Più istruzioni select in Single query


101

Sto generando un report in 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`

In questo modo ho 12 tavoli.

Posso farlo in una singola query. Se avessi fatto? Il processo diventa lento?


Per i tavoli MyISAM c'è anche un modo molto migliore, vedi la mia risposta, che è più veloce.
Pentium

Risposte:


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

Per i tavoli MyISAM c'è anche un modo molto migliore, vedi la mia risposta.
Pentium10

4
"L'operando deve contenere 1 colonna / e" - solo se le tabelle unite differiscono nel conteggio delle colonne. Dovrebbero corrispondere. 1 colonna per tabella in questo esempio.
Zon

5
funziona solo se stai restituendo un singolo output da ogni
sottoquery

25

Se utilizzi le tabelle MyISAM, il modo più veloce è interrogare direttamente le statistiche:

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

Se hai InnoDB devi interrogare con count () poiché il valore riportato in information_schema.tables è sbagliato.


1
Nel caso ve lo stiate chiedendo, consultate anche queste risposte sulla differenza tra MyISAM e InnoDB .
Paul Rougieux

16

Puoi certamente usare l'istruzione a Select Agregation come postulato da Ben James, tuttavia questo si tradurrà in una vista con tante colonne quante sono le tabelle. Un metodo alternativo può essere il seguente:

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;

La cosa bella di un approccio come questo è che puoi scrivere esplicitamente le istruzioni Union e generare una vista o creare una tabella temporanea per contenere i valori che vengono aggiunti consecutivamente da un Proc cals utilizzando variabili al posto dei nomi delle tabelle. Tendo ad andare di più con quest'ultimo, ma dipende davvero dalle preferenze personali e dall'applicazione. Se sei sicuro che le tabelle non cambieranno mai, vuoi che i dati siano in un formato a riga singola e non aggiungerai tabelle. attenersi alla soluzione di Ben James. Altrimenti consiglierei la flessibilità, puoi sempre hackerare una struttura di tabulazione incrociata.


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
A quale domanda risponde questo?
Oliv

1
Questa è una combinazione della soluzione UNION () di Miguel Castaneda e della soluzione INFORMATION_SCHEMA di Pentium10. Per favore, cita le risposte che usi.
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

So che questo è un vecchio stack, ma posterò questo caso di selezione 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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.