单个查询中的多个选择语句


101

我正在用php(mysql)生成报告,

例如:

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

这样我有12张桌子。

我可以在单个查询中做到吗。如果我做到了?过程变慢了吗?


对于MyISAM表,还有更好的方法,请参阅我的答案,这是更快的方法。
Pentium10'2

Answers:


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

对于MyISAM表,还有更好的方法,请参见我的答案。
Pentium10 '02

4
“操作数应包含1列”-仅当合并表的列数不同时。他们应该匹配。在此示例中,每个表1列。
Zon 2016年

5
仅当您从每个子查询返回单个输出时,此方法才有效
Prachi

25

如果使用MyISAM表,最快的方法是直接查询统计信息:

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

如果您拥有InnoDB,则必须使用count()进行查询,因为information_schema.tables中的报告值是错误的。



16

您当然可以使用由Ben James假定的Select Agregation语句,但是这将导致视图具有与表一样多的列。一种替代方法可能如下:

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;

这样的方法的好处是,您可以显式编写Union语句并生成视图或创建临时表,以保存使用变量代替表名从Proc cal中连续添加的值。我倾向于选择后者,但是这实际上取决于个人喜好和应用。如果您确定表永远不会改变,则您希望数据采用单行格式,并且不会添加表。坚持本·詹姆斯的解决方案。否则,我建议您保持灵活性,您可以随时修改交叉表结构。


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
这回答了什么问题?
奥利夫,2014年

1
这是Miguel Castaneda的UNION()解决方案和Pentium10的INFORMATION_SCHEMA解决方案的结合。请引用您使用的答案。
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

我知道这是一个旧堆栈,但是我将发布此Multi-SQL select案例

    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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.