Varias declaraciones de selección en una sola consulta

101

Estoy generando un informe en 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`

Así tengo 12 mesas.

¿Puedo hacerlo en una sola consulta? ¿Si lo hice? ¿El proceso se vuelve lento?

jefe
fuente
Para las tablas MyISAM hay incluso una forma mucho mejor, vea mi respuesta, que es más rápida.
Pentium10

Respuestas:

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
fuente
Para las tablas MyISAM, hay una forma mucho mejor, vea mi respuesta.
Pentium10
4
"El operando debe contener 1 columna (s)": solo si las tablas combinadas difieren en el recuento de columnas. Deben coincidir. 1 columna por tabla en este ejemplo.
Zon
5
esto solo funciona si devuelve una única salida de cada
subconsulta
25

Si usa tablas MyISAM, la forma más rápida es consultar directamente las estadísticas:

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

Si tiene InnoDB, debe consultar con count () ya que el valor informado en information_schema.tables es incorrecto.

Pentium10
fuente
1
En caso de que se lo pregunte, consulte también estas respuestas sobre la diferencia entre MyISAM e InnoDB .
Paul Rougieux
16

Ciertamente, puede usar una declaración de agregación de selección según lo postulado por Ben James, sin embargo, esto dará como resultado una vista con tantas columnas como tablas. Un método alternativo puede ser el siguiente:

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;

Lo bueno de un enfoque como este es que puede escribir explícitamente las declaraciones de Union y generar una vista o crear una tabla temporal para contener valores que se agregan consecutivamente desde un Proc cals usando variables en lugar de los nombres de sus tablas. Tiendo a ir más con este último, pero realmente depende de las preferencias personales y la aplicación. Si está seguro de que las tablas nunca cambiarán, desea los datos en un formato de una sola fila y no agregará tablas. quédate con la solución de Ben James. De lo contrario, recomendaría flexibilidad, siempre puede piratear una estructura de tabulación cruzada.

Miguel Castañeda
fuente
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
fuente
12
¿Qué pregunta responde esto?
Oliv
1
Esta es una combinación de la solución UNION () de Miguel Castaneda y la solución INFORMATION_SCHEMA de Pentium10. Cite las respuestas que utilice.
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
fuente
1

Sé que esta es una pila antigua, pero publicaré este caso de selección 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
fuente