MySQL查询昨日读经但今日未读的用户,现有查询结果错误如何修正?
现有逻辑的错误
你写的WHERE条件是针对单条行记录生效的,无法实现跨同用户的多条记录做判断:单条记录的date_read只能是一个日期,只要这条记录日期是2021-11-25,天然就不等于2021-11-26,所以这个条件会把所有11月25日有读经记录的用户都查出来(也就是user2和user3都命中),完全没过滤掉「11月26日也有读经记录」的用户。
修正后的查询方案
方案1:分组聚合判断(写法简单易读)
SELECT user_id FROM `user_bible_trackings` GROUP BY user_id HAVING MAX(CASE WHEN date_read = '2021-11-25' THEN 1 ELSE 0 END) = 1 AND MAX(CASE WHEN date_read = '2021-11-26' THEN 1 ELSE 0 END) = 0;
逻辑说明:按用户分组后,判断该用户的所有记录里,存在11月25日的记录,同时不存在11月26日的记录。
方案2:LEFT JOIN关联判断
SELECT DISTINCT t1.user_id FROM `user_bible_trackings` t1 LEFT JOIN `user_bible_trackings` t2 ON t1.user_id = t2.user_id AND t2.date_read = '2021-11-26' WHERE t1.date_read = '2021-11-25' AND t2.user_id IS NULL;
逻辑说明:先找出所有11月25日有读经记录的用户,左关联11月26日的读经记录,关联不到的就是26日没读的用户。
方案3:NOT EXISTS子查询(性能表现通常更好)
SELECT DISTINCT user_id FROM `user_bible_trackings` t1 WHERE t1.date_read = '2021-11-25' AND NOT EXISTS ( SELECT 1 FROM `user_bible_trackings` t2 WHERE t2.user_id = t1.user_id AND t2.date_read = '2021-11-26' );
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

