MySQL查询:获取指定gid用户及无对应用户的渠道数据
MySQL LEFT JOIN 查询结果丢失无匹配行的解决方法
问题分析
你的原查询中,WHERE (u.gid IN (NULL,'1', '2'))无法保留channels表中无对应users的行——当channels的uid为NULL时,LEFT JOIN后u的所有字段均为NULL,而SQL中NULL与任何值进行IN比较的结果为UNKNOWN,会被WHERE子句过滤,导致这条数据丢失。同时,channels表中uid=4的行对应users的gid=3,不符合需求,需要排除。
修改后的查询语句
SELECT c.uid, u.gid, c.time FROM channels c LEFT JOIN users u ON u.uid = c.uid WHERE (u.gid IN ('1', '2')) OR (u.uid IS NULL);
逻辑说明
LEFT JOIN users u ON u.uid = c.uid:保留channels表的所有行,匹配users表中uid相同的记录,无匹配则u的字段为NULL。WHERE (u.gid IN ('1', '2')):筛选出users表中gid为1、2的用户对应的渠道数据。OR (u.uid IS NULL):保留channels表中无对应users的行(此时u.uid为NULL)。
执行该查询后,即可得到目标结果:
| uid | gid | time |
|---|---|---|
| 1 | 1 | 23423 |
| 2 | 2 | 52422 |
| 3 | 2 | 23423 |
| NULL | NULL | 345 |
内容的提问来源于stack exchange,提问作者Olexander
相关产品推荐
相关产品推荐

