단일 쿼리의 여러 select 문


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

답변:


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

4
"연산자는 1 개의 열을 포함해야합니다"-병합 된 테이블의 열 수가 다른 경우에만 해당됩니다. 일치해야합니다. 이 예에서는 테이블 당 1 개의 열입니다.
Zon

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가있는 경우 information_schema.tables에보고 된 값이 잘못되었으므로 count ()로 쿼리해야합니다.


1
궁금한 점이 있으면 MyISAM과 InnoDB의 차이점에 대한 답변 도 참조하십시오 .
Paul Rougieux

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 cals에서 연속적으로 추가되는 값을 보유하는 임시 테이블을 만들 수 있다는 것입니다. 나는 후자를 더 많이 사용하는 경향이 있지만 실제로는 개인적 취향과 적용에 달려 있습니다. 테이블이 변경되지 않는다고 확신하는 경우 데이터를 단일 행 형식으로 원하고 테이블을 추가하지 않습니다. Ben James의 솔루션을 고수하십시오. 그렇지 않으면 유연성을 권하고 싶습니다. 언제든지 크로스 탭 구조를 해킹 할 수 있습니다.


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

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

나는 이것이 오래된 스택이라는 것을 알고 있지만이 다중 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.