MySQL多表关联查询:如何筛选购买2件及以上商品的用户uid
前提说明
先明确三张表符合业务逻辑的常规关联字段设计:
- User表主键为
uid(用户唯一标识) - Item表主键为
iid(商品唯一标识) - Purchase表为购买记录表,同时存储
uid(关联User表)、iid(关联Item表),单条记录代表用户购买一件商品的记录
不同场景的查询实现
场景1:无需筛选商品类型,直接统计所有购买2件及以上商品的用户
直接对Purchase表做分组聚合即可,无需关联其他表:
SELECT uid FROM Purchase GROUP BY uid HAVING COUNT(*) >= 2;
逻辑:按用户ID分组后,统计每个用户的购买记录数,过滤出记录数≥2的用户ID即可。
场景2:需要筛选特定类型的商品(对应你提到的Item表itype筛选需求)
关联Purchase和Item表,先过滤出符合类型的商品购买记录,再分组统计:
SELECT p.uid FROM Purchase p INNER JOIN Item i ON p.iid = i.iid WHERE i.itype = '替换为你要筛选的商品类型' GROUP BY p.uid HAVING COUNT(p.iid) >= 2;
场景3:需要确保返回的uid都是User表中存在的合法用户
额外关联User表,避免Purchase表脏数据导致返回不存在的用户ID:
SELECT u.uid FROM User u INNER JOIN Purchase p ON u.uid = p.uid INNER JOIN Item i ON p.iid = i.iid -- 可选添加商品类型筛选条件 WHERE i.itype = '替换为你要筛选的商品类型' GROUP BY u.uid HAVING COUNT(p.iid) >= 2;
核心逻辑说明
INNER JOIN用于关联匹配多张表的关联字段,只保留两边都匹配的有效记录GROUP BY按用户ID做分组,用于针对每个用户做聚合统计HAVING用于过滤分组后的聚合结果,WHERE无法直接过滤聚合计算的结果,所以必须用HAVING
内容的提问来源于stack exchange,提问作者Hahgog
相关产品推荐
相关产品推荐

