获取一周中每一天的统计数据 mysql

Get statistics for each day of the week mysql

我有一个table这样的

Click ID   |    click_user_id | click_time (timestamp) 
-----------------------------------------------------
1          |      1           |       1518810765
-----------------------------------------------------
2          |      2           |       1518845445
-----------------------------------------------------
3          |      2           |       1518945445
-----------------------------------------------------

如何获得一周中每天收到的点击次数(使用 mysql)。 结果应如下所示:

"mon":50
"tue":20
.
.
.
"sun":100

谢谢。

*编辑:

click_time (timestamp) 转换为星期几。

MySQL 提供了一些有用的功能。 FROM_UNIXTIMEDATE_FORMAT.

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_from-unixtime

作为演示:

SELECT DATE_FORMAT(FROM_UNIXTIME( 1518945445 ),'%a') AS day_of_week

我们可以用

中的列引用替换文字
SELECT DATE_FORMAT(FROM_UNIXTIME( t.click_time ) ,'%a') AS day_of_week
     , t.*
  FROM a_table_like_this t
 WHERE ...

要获得 day_of_week 的每个不同值的计数,我们将采用与 click_user_id

获得计数相同的方式
SELECT t.click_user_id 
     , SUM(1) AS cnt
  FROM a_table_like_this t   
 WHERE ...
 GROUP BY t.click_user_id

只需将出现的 t.click_user_id 替换为 returns day_of_week 的表达式。

要获得指定格式的结果,请考虑使用 LOWERCONCATENATE 函数的外部查询。

为了对行进行排序,考虑添加另一个表达式 returns 星期几的升序值,例如DATE_FORMAT( ,'%w')

SELECT CONCATENATE('"',LOWER(v.day_of_week),'":',v.cnt) AS foo
  FROM ( 
         SELECT ...     AS day_of_week
              , ...     AS cnt 
              , ...     AS daynumber
           FROM a_table_like_this t
          GROUP BY ...
       ) v
 ORDER BY v.daynumber

这可能会有点伤眼,但我们会加入以下内容:

  • data:您数据中每个工作日的计数分组
  • weekdays:派生 table 工作日名称 他们的 (ODBC) 顺序

第二个 tables 提供理论上任何 "missing" 天数据的行。我们实施它的方式也让这项工作无论您的语言环境如何。 (我的星期一是 "Monday",但你的可能是 "poniedziałek"。)

SELECT weekdays.dow, COALESCE(num_clicks, 0) FROM
       (SELECT DAYNAME(FROM_UNIXTIME(click_time)) AS "dow",
               COUNT(1) AS "num_clicks"
          FROM tbl
         GROUP BY 1) data
 RIGHT JOIN
       (SELECT DAYNAME(CURRENT_DATE - INTERVAL i DAY) AS dow,
               DAYOFWEEK(CURRENT_DATE) AS dayorder
          FROM numbers
               WHERE
               i BETWEEN 0 AND 6) weekdays
       ON
        data.dow = weekdays.dow
 GROUP BY 1
 ORDER BY weekdays.dayorder ASC

numbers table 有一个列 i 其 INT 值范围从零到...大于 6。如果你没有数字 table, 你可以在派生的 table:

中自己做
...
-- Let's start with the first Sunday in recorded history:
(SELECT DAYNAME("1970-01-04") AS dow, 0 AS dayorder
  UNION ALL
 SELECT DAYNAME("1970-01-05"), 1
  UNION ALL
 ...)