2017-03-09 69 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