繁体   English   中英

如何更有效地编写以下MySQL查询?

[英]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_idusers表的外键

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM