2015-06-15 9 views
0

我需要幫助,我試着想解決這個問題,但我無法找到如何解決與MySQL,我需要,如果用戶有記錄在本週,並顯示此結果與此形式:知道如果用戶有一週在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

你在這裏做了兩件事。

  1. 按星期總結您的data表。
  2. 旋轉您的摘要,以便行顯示爲列。

首先,要按周分組,您需要一個表達式,該表達式將採用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 

由於這種樞查詢的一般僵化的,你可能更願意做這個旋轉在某種報告程序而不是。

相關問題