Mysql 使用同一表上的左联接的成员资格续订报告

Mysql 使用同一表上的左联接的成员资格续订报告,mysql,sql,left-join,inner-join,Mysql,Sql,Left Join,Inner Join,我有两张桌子: Member 'id' 'name' Membership 'id' 'site_id' 'member_id' 'year' 我想建立一个报告,以便在这样的年份跟踪订阅情况: 站点id 2019年认购总额 2018年认购总额 新建(首次订阅该网站) 续约(2019年和2018年在同一地点续约) 丢失(2018年完成但未在2019年完成该现场的潜水艇) 我在同一张会员资格表中的两个左连接上苦苦挣扎,如下所示: SELECT m.site_id, count(m2019.id

我有两张桌子:

Member
'id'
'name'

Membership
'id'
'site_id'
'member_id'
'year'
我想建立一个报告,以便在这样的年份跟踪订阅情况:

  • 站点id
  • 2019年认购总额
  • 2018年认购总额
  • 新建(首次订阅该网站)
  • 续约(2019年和2018年在同一地点续约)
  • 丢失(2018年完成但未在2019年完成该现场的潜水艇)
  • 我在同一张
    会员资格
    表中的两个左连接上苦苦挣扎,如下所示:

    SELECT m.site_id, 
    count(m2019.id) as total2019, 
    count(m2018.id) as total2018, 
    SUM(IF(m2019.member_id IS NOT NULL AND m2018.member_id IS NULL, 1, 0)) new, 
    SUM(IF(m2019.member_id IS NOT NULL AND m2018.member_id IS NOT NULL AND m2018.site_id = m2019.site_id, 1, 0)) renewal, 
    SUM(IF(m2018.member_id IS NOT NULL AND m2019.member_id IS NULL, 1, 0)) lost 
    FROM membership m 
    LEFT JOIN membership m2019 ON m.id = m2019.member_id AND m.year = '2019' AND m2019.year = '2019' AND m.site_id = m2019.site_id 
    LEFT JOIN membership m2018 ON m.id= m2018.member_id AND m.year = '2018' AND m2018.year = '2018' AND m.site_id = m2018.site_id 
    GROUP BY m.site_id;
    
    计数是正确的,但条件是不正确的,所以我很确定我的查询是不正确的。 我在上面已经很久了,我开始觉得有点失落

    谁能帮我找出哪里做错了?
    谢谢

    我认为您可以通过两个级别的聚合来做您想做的事情:

    SELECT m.site_id, 
           SUM( m.max_year = 2019 ) as total2019, 
           SUM( m.min_year = 2018 ) as total2018,
           SUM( m.min_year = 2019 AND m.max_year = 2019 ) as new2019,
           SUM( m.min_year = 2018 and m.max_year = 2018 ) as renewals,
           SUM( m.max_year = 2018 ) as lost
    FROM (SELECT m.id, m.site_id, MIN(year) as min_year, MAX(year) as max_year
          FROM membership m
          WHERE year in (2018, 2019)
          GROUP BY m.id, m.site_id
         ) mm
         ON mm.id = m.id
    GROUP BY m.site_id;
    

    我认为通过两个级别的聚合,您可以做您想做的事情:

    SELECT m.site_id, 
           SUM( m.max_year = 2019 ) as total2019, 
           SUM( m.min_year = 2018 ) as total2018,
           SUM( m.min_year = 2019 AND m.max_year = 2019 ) as new2019,
           SUM( m.min_year = 2018 and m.max_year = 2018 ) as renewals,
           SUM( m.max_year = 2018 ) as lost
    FROM (SELECT m.id, m.site_id, MIN(year) as min_year, MAX(year) as max_year
          FROM membership m
          WHERE year in (2018, 2019)
          GROUP BY m.id, m.site_id
         ) mm
         ON mm.id = m.id
    GROUP BY m.site_id;
    

    样本数据和期望的结果会有帮助。样本数据和期望的结果会有帮助。这就是我需要的。谢谢你这正是我需要的。非常感谢。