如何编写SQL查询对同一列设置两个AND条件筛选符合要求的访问URL
错误原因分析
你原查询的逻辑存在问题:要求同一条访问记录对应的用户同时属于child和18-25两个人群,单个用户不可能同时符合两个人群标签,因此必然返回空结果。
你实际需要的逻辑是:同一个URL,存在至少一条对应儿童用户的访问记录,同时存在至少一条对应18-25岁用户的访问记录。
修正方案
方案1:分组聚合统计(推荐,性能更优)
先关联访问表和用户表,按URL分组,校验分组内是否同时包含两个人群标签即可:
SELECT V.url FROM Visit V JOIN `User` U ON V.uid = U.uid WHERE U.demo IN ('child', '18-25') GROUP BY V.url -- 保证两个不同的人群标签都出现过 HAVING COUNT(DISTINCT U.demo) = 2;
方案2:双表关联(和你原写法思路更接近)
分别关联儿童的访问记录、18-25岁人群的访问记录,匹配相同的URL即可:
SELECT DISTINCT V_child.url FROM Visit V_child -- 关联儿童用户的访问 JOIN `User` U_child ON V_child.uid = U_child.uid AND U_child.demo = 'child' -- 关联相同URL下18-25岁用户的访问 JOIN Visit V_adult ON V_child.url = V_adult.url JOIN `User` U_adult ON V_adult.uid = U_adult.uid AND U_adult.demo = '18-25';
两种方案都能返回你预期的结果A01。
内容的提问来源于stack exchange,提问作者Killua87
相关产品推荐
相关产品推荐

