SQL关联两张表查询指定用户所有活动及接受/主办状态邀请统计数
问题根因
你当前的写法存在两个核心问题,导致会过滤掉无符合条件邀请的活动:
- 用
RIGHT JOIN且将status的筛选条件放在了WHERE子句中:没有匹配邀请记录、或者邀请记录都不符合accepted/host的活动会被直接过滤 - 直接用
COUNT(b.status)会统计所有非空的邀请状态,无法实现只统计指定状态的需求
解决方法
调整连接方式,将状态筛选逻辑移到计数逻辑内即可,修改后的语句如下:
var sqlString = "SELECT a.name, a.venueAdresse, a.userID, a.tblEventID, a.venueCity, a.startTimeAndDateUnixTicks, a.displayStartTime, a.slots, a.eventPictureThumb, \ SUM(CASE WHEN b.status IN ('accepted', 'host') THEN 1 ELSE 0 END) AS valid_invite_count \ FROM 10561_12865_tblEvents a \ LEFT JOIN 10561_12865_tblInvites b ON a.tblEventID = b.tblEventID \ WHERE a.userID = '" + userID + "' \ GROUP BY a.tblEventID \ ORDER BY a.createdUnixInt DESC \ LIMIT " + start + "," + count
改动说明
- 将
RIGHT JOIN改为LEFT JOIN:以活动表为主表,保证所有指定USERID的活动都会被保留,不管是否存在对应的邀请记录 - 用
SUM(CASE WHEN ...)实现条件计数:只有状态为accepted或host的邀请才会被计入统计值,没有符合条件的记录时自动返回0,不会过滤活动 - 新增
GROUP BY a.tblEventID:按活动唯一ID分组,保证每个活动返回一条独立的统计结果 - 给统计列添加别名
valid_invite_count,方便后续业务代码取值
如果你的数据库支持COUNT_IF语法,也可以把统计部分替换为COUNT_IF(b.status IN ('accepted', 'host')) AS valid_invite_count,写法更简洁。
内容的提问来源于stack exchange,提问作者innom
相关产品推荐
相关产品推荐

