你在這裏做了兩件事。
- 按星期總結您的
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
由於這種樞查詢的一般僵化的,你可能更願意做這個旋轉在某種報告程序而不是。