[英]How can I write following MySQL query more efficient?
这是users表, id是主键。 [与出勤率表的一对多关系]
+------------+-----------------+
| id | name | created |
+------------+-----------------+
| 1 | Sumon | 2015-01-10 |
+------------+-----------------+
| 2 | James | 2015-01-11 |
+------------+-----------------+
| ...| ... | ... |
+------------+-----------------+
这是另一张表的出席情况 。 这里的id是主键, user_id是users表的外键
+--------------+------+--------+-----------------+
| 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查询
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
我的上述MySQL查询的结果如下所示
+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+
| january | february | march | april | may | june | july | august | september | october | november | december |
+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+
| 24 | 17 | 20 | 0 | 24 | 23 | 19 | 24 | 13 | 0 | 0 | 0 |
+---------+----------+-------+-------+-----+-------+------+--------+-----------+---------+----------+----------+
有没有办法更有效地编写这个相同的查询?
您可以使用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'
使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.