2012-12-26 2 views
2

시스템 내에서 생성되는 물건, 판매, 고객 계정 등을 추적하는 다양한 테이블이 있습니다. 모두 테이블에 시간을 생성했습니다. 아무 일 없을 때이 일을 건너 않지만 일을 얻을 수MySQL - 하루에 여러 테이블 계산

+--------------------+----------+ 
| date(created_time) | count(*) | 
+--------------------+----------+ 
| 2012-10-12   |  15 | 
| 2012-10-13   |  4 | 

: 같은 출력을 생성

select date(created_time), count(*) from customers group by date(created_time) 

: 나는 다음과 같은 쿼리를 하루 단위로 다음 중 하나를 요약 할 수 있습니다 .

그러나 내가하고 싶은 것 같은 것을 생산하고, 한 번에 여러 테이블 같은 일을 생성 할 수 있습니다 : 나는 각 테이블에 대해 개별적으로 쿼리를 실행하고 손으로 그들과 합류 할 수

+--------------------+--------------+------------------+ 
| date(created_time) | count(sales) | count(customers) | 
+--------------------+--------------+------------------+ 
| 2012-10-12   |   15 |    1 | 
| 2012-10-13   |   4 |    3 | 

을하지만, 0 일을 건너 뛰면 참여가 어려워집니다.

하나의 mysql 쿼리에서이 작업을 수행 할 수있는 방법이 있습니까?

+0

모든 테이블이 동일한 구조를 가지고 있습니까? date (created_time)에 외부 조인을 할 수 있습니다 : a.date (created_time), a.count (*), b.count (*)를 선택합니다. a.date (created_time), b.date (created_time)에 의해 date (created_time) 그룹. 참고 :이 date() 함수를 사용하면 SLOW 쿼리를 만들 수 있습니다. 얼마나 많은 데이터가 있습니까? – Melanie

+0

그들은 모두 created_time 열을가집니다. 그렇지 않으면 서로 완전히 다릅니다. 가장 큰 것은 170,000 개의 행과 빠른 속도입니다. –

+0

저는 쿼리 효율성에 대한 전문가는 아니지만 위의 제안에서 date() 함수를 사용하면 속도가 느려질 수 있음을 알고 있습니다. 아마도 누군가가 계산 된 열을 사용하여 날짜를 저장하는 효능에 대해 논평 할 수 있습니까? – Melanie

답변

1

이 시도 :

SELECT created_time, SUM(customers), SUM(sales) 
FROM (SELECT DATE(created_time) created_time, COUNT(*) customers, 0 sales 
     FROM customers 
     GROUP BY created_time 
     UNION 
     SELECT DATE(created_time) created_time, 0 customers, COUNT(*) sales 
     FROM sales 
     GROUP BY created_time 
    ) as A 
GROUP BY created_time; 
+0

'union'보다는'union all'을 사용해야합니다. 중복을 제거 할 필요는 없습니다. –

+0

우리가 할 수는 있지만 사용자가 원하는 쿼리 유형에 따라 달라집니다. –

+0

아니요, 전혀 의존성이 없습니다. 행은 피벗 (pivoting)하는 방식 때문에 모두 구별됩니다. 'union' 대신에'union all'을 사용하십시오. –