2016-09-02 3 views
1

여기에 사용자 테이블과 id이 기본 키입니다. [많은 관계 하나 와 출석 테이블 여기서다음 MySQL 쿼리를보다 효율적으로 작성하려면 어떻게해야합니까?

+------------+-----------------+ 
| id | name |  created  | 
+------------+-----------------+ 
| 1 | Sumon |  2015-01-10 | 
+------------+-----------------+ 
| 2 | James |  2015-01-11 | 
+------------+-----------------+ 
| ...| ... |  ...   | 
+------------+-----------------+ 

다른 테이블 출석이다. 여기 ID는 기본 키 및 USER_ID사용자 테이블

+--------------+------+--------+-----------------+ 
| id | user_id | year | month |  created  | 
+--------------+------+--------+-----------------+ 
| 1 | 2  | 2015 | 1  |  2015-01-10 | 
+--------------+---------------+-----------------+ 
| 2 | 1  | 2016 | 2  |  2016-02-10 | 
+--------------+------+--------+-----------------+ 
| 3 | 1  | 2016 | 2  |  2016-02-11 | 
+--------------+------+--------+-----------------+ 
| ...| ...  | ... | ... |  ...   | 
+--------------+------+--------+-----------------+ 

나의 현재 MySQL의 쿼리를 다음과 같이

처럼 내 MySQL은 위의 쿼리의

SELECT COUNT(DISTINCT user_id) AS january, 
(SELECT COUNT(DISTINCT user_id) FROM attendances WHERE year='2016' AND month=2) as february, 
(SELECT COUNT(DISTINCT user_id) FROM attendances WHERE year='2016' AND month=3) as march, 
... 
... 
(SELECT COUNT(DISTINCT user_id) FROM attendances WHERE year='2016' AND month=12) as december 
FROM attendances WHERE year='2016' AND month=1 

결과의 외부 키입니다

+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+ 
| january | february | march | april | may | june | july | august | september | october | november | december | 
+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+ 
| 24  | 17  | 20 | 0  | 24 | 23 | 19 | 24  | 13  | 0  | 0  | 0  | 
+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+ 

이 동일한 쿼리를보다 효율적으로 작성하는 방법은 무엇입니까?

+0

프리젠 테이션 레이어에 데이터 표시의 처리 문제를 고려. 그것은 훨씬 더 유연하고 확장 가능합니다. – Strawberry

+0

'group by'문을 사용할 수 있습니다. http://www.w3schools.com/sql/sql_groupby.asp – Webman

+0

감사합니다. @ 딸기 –

답변

2

당신은 CASE WHEN을 사용할 수

SELECT COUNT(DISTINCT (CASE WHEN month = 1 THEN user_id END)) as january, 
     COUNT(DISTINCT (CASE WHEN month = 2 THEN user_id END)) as february, 
     COUNT(DISTINCT (CASE WHEN month = 3 THEN user_id END)) as march 

FROM attendances 
WHERE year='2016' 
+0

감사합니다! 이 쿼리는 내 쿼리보다 효율적으로 작동합니다. –

1

사용 group by

select count(DISTINCT user_id), year, MONTHNAME(STR_TO_DATE(month, '%m')) 
from attendances 
where year='2016' 
group by month 
order by month 
관련 문제