【问题标题】:SQL For Counting Passive Subscribers Between Given Dates用于计算给定日期之间的被动订阅者的 SQL
【发布时间】:2012-02-11 09:32:42
【问题描述】:

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

表格

- 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

通常这就是我可以计算在给定 2 个日期之间订阅和订阅完成的成员的方法。

我所追求的是让订阅在给定 2 个日期之间结束但没有更多有效订阅的成员数量。

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

【问题讨论】:

  • 您不能简单地使用 hasSubscription 字段将您的查询限制为没有任何订阅的成员吗?还是该字段不那样工作?
  • hasSubscription 仅用于判断成员是否曾经订阅过。它不用于是否有活动订阅。再想一想(最近睡得不多)也许最好再增加一个字段来确定会员是否有活跃订阅。

标签: sql count inner-join


【解决方案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
        )

【讨论】:

  • 谢谢不存在...这就是我所追求的(:
  • 值得检查这个与 LEFT JOIN 等效项的性能。 MySQL 通常在优化 LEFT JOIN 方面做得更好。
【解决方案2】:

了解这两个查询的执行计划如何变化会很有趣。从过去的经验来看,这个带有 LEFT JOIN 的版本应该更有效 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多