2016-09-02 4 views
1

ここにはユーザーテーブルとidが主キーです。ここで次のMySQLクエリをより効率的に書く方法はありますか?

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

[出席テーブルとの一対多の関係は、別のテーブルには、出席です。ここでIDは、主キーであるとUSER_ID

以下のようにのように私の上記の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 

結果ユーザーテーブル

+--------------+------+--------+-----------------+ 
| 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 | 
+--------------+------+--------+-----------------+ 
| ...| ...  | ... | ... |  ...   | 
+--------------+------+--------+-----------------+ 

の外部キーであります

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

thこの同じクエリをより効率的に書く方法はありますか?

+0

は、プレゼンテーション層でのデータ表示の取り扱いの問題を考えてみましょう。それははるかに柔軟でスケーラブルです。 – Strawberry

+0

あなたは 'group by'ステートメントを使用できます。http://www.w3schools.com/sql/sql_groupby.asp – Webman

+0

ありがとうございます@Strawberry –

答えて

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 
関連する問題