単一クエリ内の複数の選択ステートメント


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、2010

回答:


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、2010

4
「オペランドには1列を含める必要があります」-マージされたテーブルの列数が異なる場合のみ。それらは一致するはずです。この例では、テーブルごとに1列。
Zon

5
これは、各
サブクエリ

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を使用している場合は、information_schema.tablesで報告された値が間違っているため、count()でクエリを実行する必要があります。



16

確かに、ベンジェームスによって仮定された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から連続的に追加される値を保持する一時テーブルを作成したりできることです。私は後者を使う傾向がありますが、それは個人の好みとアプリケーションに本当に依存します。テーブルが変更されないことが確実な場合は、データを1行の形式で取得し、テーブルを追加することはありません。ベン・ジェームスの解決策に固執する。それ以外の場合は、柔軟性をお勧めします。いつでもクロス集計構造をハックできます。


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
これでどんな質問に答えますか?
Oliv 2014年

1
これは、Miguel CastanedaのUNION()ソリューションとPentium10のINFORMATION_SCHEMAソリューションの組み合わせです。使用する回答を引用してください。
HoldOffHunger 2018

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

私はこれが古いスタックであることを知っていますが、このマルチ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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.