2017-03-09 71 views
0

我有以下代碼:一列連接表不受WHERE子句,我的SQL

SELECT YEAR(user.reg_date) AS year, 
    MONTH(user.reg_date) AS month, 
    DATE (
     CASE 
      WHEN DAYOFWEEK(user.reg_date) >= 2 
       THEN DATE_SUB(user.reg_date, INTERVAL(DAYOFWEEK(user.reg_date) - 2) DAY) 
      ELSE DATE_ADD(user.reg_date, INTERVAL 1 DAY) 
      END 
     ) AS week_of, 
    count(*) AS signups, 
    COUNT(CASE 
      WHEN user.gender = 'M' 
       THEN user.user_id 
      END) AS males, 
    COUNT(CASE 
      WHEN user.gender = 'F' 
       THEN user.user_id 
      END) AS females, 
    (
     SELECT COUNT(*) 
     FROM unsubscribe 
     INNER JOIN user ON user.token = unsubscribe.token 
     WHERE DATE (DATETIME) BETWEEN week_of 
       AND DATE_ADD(week_of, INTERVAL 6 DAY) 
     ) AS unsubscribe 
FROM user 
INNER JOIN place ON user.place_id = place.place_id 
WHERE user.reg_date IS NOT NULL 
    AND YEAR(user.reg_date) >= YEAR(CURDATE()) - 2 
    AND place.contained_by = '207' 
GROUP BY CONCAT (
     YEAR(user.reg_date), 
     '/', 
     WEEK(user.reg_date) 
     ) 
ORDER BY week_of; 

我的決賽桌結果幾乎工作,但所謂退訂在連接表中的列將不受影響/不通過過濾最後的聲明,我不知道爲什麼。

編輯: 這是我得到的結果。模式是正確的,但是所有列都通過place_id EXCEPT進行過濾以取消訂閱。我需要取消訂閱,也可以通過place_id進行過濾。

|year |month |week_of |signups |males |females |unsubscribe | 
|2015 |1  |2014-12-29 |5  |1  |4  |269   | 
+0

你可能會需要一個嵌套查詢。 – LSerni

+0

什麼是「最後哪裏聲明」? –

+0

@JNevill感謝您的編輯!對不起,這是新的! – knod

回答

0

我相信您需要根據用戶表中的place_id將您的子查詢與WHERE子句中的主查詢相關聯。您在主查詢過濾你的地方表,而你在user表中的子查詢已加盟,這樣你就可以使用user.place_id要做到這一點您的WHERE子句。

SELECT COUNT(*) 
FROM unsubscribe INNER JOIN user 
    ON user.token = unsubscribe.token 
WHERE DATE (DATETIME) BETWEEN week_of 
    AND DATE_ADD(week_of, INTERVAL 6 DAY) 
    AND user.place_id = place.place_id 
+0

這使得取消訂閱列全部爲0(我知道情況並非如此)。 – knod

+0

也許我已經對你正在嘗試做的另一個假設。我想我現在明白了。我會在一秒鐘內把它寫下來。 – JNevill

+0

好的,我用另一個刺戳了它。這應該給您未訂閱用戶的計數時間範圍內,並過濾它是在主查詢中使用的WHERE語句的主要查詢的place.place_id相關過濾place_id。 – JNevill