用于计算给定日期之间的被动订阅服务器的SQL

用于计算给定日期之间的被动订阅服务器的SQL,sql,count,inner-join,Sql,Count,Inner Join,为了完成我正在做的一个项目中的统计部分,我工作了一整晚。此统计部分的一部分是向管理员显示哪些订阅者在给定日期之间没有续订 表格 - members - id (int) hasSubscription (enum 1,0) - subscriptions - id (int) member_id (int) endDate (date) active (enum 1,0) 示例 SELECT COUNT(*) FROM members as m INNER JOIN subscriptio

为了完成我正在做的一个项目中的统计部分,我工作了一整晚。此统计部分的一部分是向管理员显示哪些订阅者在给定日期之间没有续订

表格

- members -
id (int)
hasSubscription (enum 1,0)

- subscriptions -
id (int)
member_id (int)
endDate (date)
active (enum 1,0)
示例

SELECT COUNT(*) FROM members as m 
INNER JOIN subscriptions as s ON s.member_id = m.id
WHERE
s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
s.active = 0
m.hasSubscription = 1
通常情况下,我可以这样计算在给定的两个日期之间拥有订阅并完成订阅的成员数

我所追求的是拥有在给定的两个日期之间结束订阅但没有更多活动订阅的成员数


在这一点上,我不能再直接思考了。如果您能帮助我,我将非常高兴。

听起来您需要这样的东西:

SELECT  COUNT(*) 
FROM    members as m 
        INNER JOIN subscriptions AS s 
            ON s.member_id = m.id
WHERE   s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
AND     s.active = 0
AND     m.hasSubscription = 1
AND     NOT EXISTS
        (   SELECT  1
            FROM    Subscriptions a
            WHERE   a.MemberID = m.ID
            AND     a.Active = 1
        )

了解执行计划如何随这两个查询而变化会很有趣。根据过去的经验,这个版本的左连接应该更有效-

SELECT  COUNT(*) 
FROM    members as m 
INNER JOIN subscriptions AS s 
    ON s.member_id = m.id
    AND s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
    AND s.active = 0
LEFT JOIN subscriptions a
    ON a.member_id = m.id
    AND s.endDate < a.endDate
    AND a.active = 1
WHERE m.hasSubscription = 1
AND a.member_id IS NULL
选择计数(*)
来自成员国的m
内部联接订阅作为
在s.member_id=m.id上
和s.截止日期介于“2011-01-01”和“2011-02-01”之间
s.active=0
左加入订阅a
在a.member_id=m.id上
和s.endDate
您不能简单地使用hasSubscription字段将查询限制为没有任何订阅的成员吗?或者该字段不是这样工作的吗?hasSubscription仅用于成员是否有订阅。它不用于确定是否存在活动订阅。再想一想(最近没睡太多),也许最好添加另一个字段来确定成员是否有活动订阅。谢谢不存在。。。这就是我所追求的(:与左连接的性能相比,值得检查一下。MySQL通常在优化左连接方面做得更好。