SQL查询如何为未匹配的指定用户生成带默认值的结果行
你需要先构造待查询的用户全集和帖子的全组合,再左关联阅读记录表填充状态即可,参考实现如下:
SELECT t1.post_id, t1.text, u.user_id, COALESCE(t2.read, false) AS `read` FROM table1 t1 -- 生成你需要覆盖的目标用户列表 CROSS JOIN ( SELECT 1 AS user_id UNION ALL SELECT 2 UNION ALL SELECT 3 ) u LEFT JOIN table2 t2 ON t2.post_id = t1.post_id AND t2.user_id = u.user_id
逻辑说明
- 先用子查询
u构造出你要查询的1、2、3三个用户的全集,和table1做交叉连接,得到「每个帖子对应每个目标用户」的全量基础行,你当前示例里只有1条帖子,所以会先生成3行基础数据,user_id分别对应1、2、3 - 再用
LEFT JOIN关联table2阅读记录表,只有同时匹配post_id和user_id的行才能拿到真实的read值,无匹配的行read字段会返回NULL - 最后通过
COALESCE函数把NULL值替换为默认的false,就能得到你预期的结果
如果你的用户ID是存储在独立的用户表中,也可以把子查询u替换为从用户表筛选的逻辑,比如SELECT user_id FROM user WHERE user_id IN (1,2,3),后续调整查询的用户范围会更方便。
内容的提问来源于stack exchange,提问作者lovrodoe
相关产品推荐
相关产品推荐

