簡體   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