知道用户是否在mysql中有一周的记录

时间:2015-06-15 20:52:45

标签: mysql database

我需要帮助,我试着考虑解决这个但我无法找到如何解决mysql,我需要如果用户在本周有记录,并用这个表格显示这个结果:

       |  user 1  |  user 2  |  user 3
week 1 |    YES   |   NO     |   YES
week 2 |    YES   |   YES    |   NO
week 3 |    YES   |   NO     |   YES
week 4 |    NO    |   YES    |   YES
week 5 |    YES   |   NO     |   NO
week 6 |    YES   |   NO     |   YES

我有表用户和其他表数据

Table data have: 
-id_user
-info
-date (datetime)

Table users
-id
-name

非常感谢你帮助我!!

1 个答案:

答案 0 :(得分:0)

你已经有两件事要做了。

  1. 按周总结您的data表格。
  2. 透视摘要,以便将行显示为列。
  3. 首先,要按周分组,您需要一个表达式,该表达式将采用DATETIME值并将其减少到不同的星期。如果你正在处理年终边界,最简单的方法是TRUNCATE操作,它将任何时间戳转换为它出现的一周的第一天。

    FROM_DAYS(TO_DAYS(`date`) -MOD(TO_DAYS(`date`) -1, 7))
    

    这样做,在任何日期产生前一个星期日。如果您的周数从周一开始,请将-2替换为-1

    使用它来做摘要,你得到这个:

    SELECT FROM_DAYS(TO_DAYS(`date`) -MOD(TO_DAYS(`date`) -1, 7)) week_beginning,
           id_user
      FROM `data`
     GROUP BY FROM_DAYS(TO_DAYS(`date`) -MOD(TO_DAYS(`date`) -1, 7)), id_user
    

    然后您需要转动该结果集。透视是MySQL中一个臭名昭着的痛苦。如果您知道用户想要的列,这应该可以解决问题。这利用了SUM(boolean)加起来boolean出现的次数这一事实。

    SELECT week_beginning, 
           CASE SUM(users.user = 'user_1') WHEN 0 THEN 'NO' ELSE 'YES' END 'user_1',
           CASE SUM(users.user = 'user_2') WHEN 0 THEN 'NO' ELSE 'YES' END 'user_2',
           CASE SUM(users.user = 'user_3') WHEN 0 THEN 'NO' ELSE 'YES' END 'user_3'
      FROM (
            SELECT FROM_DAYS(TO_DAYS(`date`) -MOD(TO_DAYS(`date`) -1, 7)) week_beginning,
                   id_user
              FROM `data`
             GROUP BY FROM_DAYS(TO_DAYS(`date`) -MOD(TO_DAYS(`date`) -1, 7)), id_user
           ) summary
     JOIN users ON summary.id_user = users.id
    GROUP BY summary.week_beginning
    ORDER BY summary.week_beginning
    

    由于此类数据透视查询的一般不灵活性,您可能更愿意在某种报表程序中进行此数据透视。