我需要帮助,我试着考虑解决这个但我无法找到如何解决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
非常感谢你帮助我!!
答案 0 :(得分:0)
你已经有两件事要做了。
data
表格。首先,要按周分组,您需要一个表达式,该表达式将采用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
由于此类数据透视查询的一般不灵活性,您可能更愿意在某种报表程序中进行此数据透视。