SQL查询:找出租赁同一车型的去重用户(三表关联场景)
看起来你已经把表关联的基础查询做好了,但需要进一步筛选出那些和其他用户共享过同一车型租赁记录的用户,同时还要去掉同一用户重复租同一车型的冗余记录。我来帮你调整一下查询语句,精准得到你想要的结果。
首先,我们需要明确两个核心需求:
- 只保留有至少一个其他用户也租过的车型对应的用户记录
- 同一用户同一车型只显示一次,不管他租了多少次
这里有两种简洁的实现方式,你可以根据自己的习惯选择:
方法一:使用CTE(公共表表达式)分步处理
这种方式逻辑清晰,容易理解:
-- 第一步:获取每个用户租过的唯一车型(去重同一用户重复租同一车型的情况) WITH user_unique_models AS ( SELECT DISTINCT u.id, u.name, c.model FROM user u JOIN rent r ON u.id = r.userId JOIN car c ON r.rentId = c.rent ), -- 第二步:找出有多个不同用户租过的车型 model_user_counts AS ( SELECT model, COUNT(DISTINCT id) AS user_count FROM user_unique_models GROUP BY model HAVING user_count >= 2 ) -- 第三步:匹配出所有租过这些共享车型的用户 SELECT uum.id, uum.name, uum.model FROM user_unique_models uum JOIN model_user_counts muc ON uum.model = muc.model ORDER BY uum.model, uum.id;
方法二:使用EXISTS子查询直接筛选
如果喜欢更紧凑的写法,可以用EXISTS来检查当前车型是否有其他用户租赁:
SELECT DISTINCT u.id, u.name, c.model FROM user u JOIN rent r ON u.id = r.userId JOIN car c ON r.rentId = c.rent -- 筛选条件:当前车型存在其他用户租赁记录 WHERE EXISTS ( SELECT 1 FROM user u2 JOIN rent r2 ON u2.id = r2.userId JOIN car c2 ON r2.rentId = c2.rent WHERE c2.model = c.model AND u2.id != u.id -- 排除当前用户自己 ) ORDER BY c.model, u.id;
这两种方法都会返回你预期的结果:
+----+---------+---------+ | id | name | model | +----+---------+---------+ | 1 | alex | kia | | 3 | michael | kia | +----+---------+---------+
补充说明你原查询的问题
你原来的查询只是将三张表做了关联,返回了所有租赁记录,但没有:
- 去重同一用户同一车型的多次租赁(比如alex租了两次kia,原查询返回了两条)
- 筛选出只有多个用户租赁过的车型(比如bmw只有samuel租过,hyundai只有michael租过,这些都需要排除)
内容的提问来源于stack exchange,提问作者darkboy
相关产品推荐
相关产品推荐

