Várias instruções de seleção em uma única consulta

101

Estou gerando um relatório em 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`

Assim, tenho 12 mesas.

Posso fazer isso em uma única consulta. Se eu fiz? O processo fica lento?

patrão
fonte
Para tabelas MyISAM, há uma maneira ainda melhor, veja minha resposta, que é mais rápida.
Pentium10 de

Respostas:

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
sato
fonte
Para tabelas MyISAM, há uma maneira ainda melhor, veja minha resposta.
Pentium10 de
4
"Operando deve conter 1 coluna (s)" - somente se as tabelas mescladas diferirem na contagem de colunas. Eles devem corresponder. 1 coluna por tabela neste exemplo.
Zon
5
isso só funciona se você estiver retornando uma única saída de cada subconsulta
Prachi
25

Se você usa tabelas MyISAM, a maneira mais rápida é consultar diretamente as estatísticas:

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

Se você tiver InnoDB, terá que consultar com count (), pois o valor relatado em information_schema.tables está errado.

Pentium10
fonte
1
Caso você esteja se perguntando, veja também estas respostas sobre a diferença entre MyISAM e InnoDB .
Paul Rougieux de
16

Você certamente pode usar a declaração Select Agregation como postulada por Ben James, no entanto, isso resultará em uma visualização com tantas colunas quanto as tabelas. Um método alternativo pode ser o seguinte:

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;

O bom de uma abordagem como essa é que você pode escrever explicitamente as instruções Union e gerar uma visualização ou criar uma tabela temporária para armazenar valores que são adicionados consecutivamente a partir de um Proc cal usando variáveis ​​no lugar dos nomes de sua tabela. Costumo ir mais com o último, mas realmente depende da preferência pessoal e da aplicação. Se você tiver certeza de que as tabelas nunca serão alteradas, você deseja os dados em um formato de linha única e não adicionará tabelas. fique com a solução de Ben James. Caso contrário, eu aconselharia flexibilidade, você sempre pode hackear uma estrutura de tabulação cruzada.

Miguel Castaneda
fonte
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
fonte
12
Que pergunta é respondida por isso?
Oliv,
1
Esta é uma combinação da solução UNION () de Miguel Castaneda e da solução INFORMATION_SCHEMA do Pentium10. Por favor, cite as respostas que você usa.
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
fonte
1

Eu sei que esta é uma pilha antiga, mas postarei este caso de seleção 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'
Niclausel
fonte