SQLite多表查询异常:指定分类下无法获取全部用户及关联type_ac
解决方法:用左外连接替代内连接
这问题我熟!你现在遇到的是内连接和左外连接的核心区别问题,我给你捋清楚:
你原来的SQL用的是隐式内连接(逗号分隔两个表+WHERE匹配条件),这种方式只会返回两个表中存在关联关系的记录,所以没和分类01关联的用户直接被过滤掉了。要实现「返回所有用户,无关联的type_ac为空」的需求,得用左外连接(LEFT JOIN),把tab_user作为主表,确保所有用户都被保留,关联不上的记录对应字段自动填充为NULL(也就是你要的空值)。
修改后的SQL语句
SELECT tab_user.id_usr AS _id, tab_user_cat.type_ac FROM tab_user LEFT JOIN tab_user_cat_relationship AS tab_user_cat ON tab_user.id_usr = tab_user_cat.id_usr AND tab_user_cat.id_cat = '01';
关键要点说明
- 用
LEFT JOIN指定左外连接,主表是tab_user,所以不管有没有匹配的关联记录,所有用户都会被返回 - 把分类ID的筛选条件
tab_user_cat.id_cat = '01'放在ON子句里,而不是WHERE里:如果放在WHERE里,会过滤掉那些没有关联记录的用户(因为这些用户的tab_user_cat.id_cat是NULL,NULL = '01'不成立),相当于又变回内连接了 - 别名
tab_user_cat对应你的关联表tab_user_cat_relationship,和你原来的写法保持一致,语句更简洁
执行这个语句后,就能得到你期望的结果:所有用户都会出现在结果里,没有关联分类01的用户type_ac字段为空(实际存储是NULL,大部分客户端会显示为空)。
内容的提问来源于stack exchange,提问作者Choletski
相关产品推荐
相关产品推荐

