SQL技术求助:筛选特定用户未拥有但他人有重复的物品
解决方案
核心需求是筛选出特定用户未拥有且**其他用户存在重复记录(dup=1)**的物品,以下是针对性的SQL写法及问题修正说明:
基础查询:直接列出符合条件的物品详情
如果只需要物品本身的信息,可使用以下语句(以用户ID=17为例):
SELECT DISTINCT t2.id AS item_id, t2.item_no, t2.item_name FROM table3 t3 JOIN table2 t2 ON t3.item_id = t2.id -- 排除目标用户已拥有的物品 LEFT JOIN table3 user_owned ON user_owned.user_id = 17 AND user_owned.stat = 1 AND user_owned.item_id = t2.id WHERE t3.user_id != 17 -- 仅考虑其他用户的记录 AND t3.dup = 1 -- 限定为重复物品 AND user_owned.id IS NULL -- 确保目标用户未拥有该物品 ORDER BY t2.id;
保留按用户分组的展示形式(修正你的原有SQL)
如果需要继续按其他用户分组,展示每个用户持有的、目标用户未拥有的重复物品列表,可修改为:
SELECT t3.user_id AS User_ID, t1.user_name AS Username, GROUP_CONCAT(DISTINCT t2.id ORDER BY t2.id ASC) AS Item_ID_List, GROUP_CONCAT(DISTINCT t2.item_name ORDER BY t2.id ASC) AS Item_Name_List FROM table3 t3 JOIN table2 t2 ON t3.item_id = t2.id JOIN table1 t1 ON t3.user_id = t1.id -- 排除目标用户已拥有的物品 LEFT JOIN table3 user_owned ON user_owned.user_id = 17 AND user_owned.stat = 1 AND user_owned.item_id = t2.id WHERE t3.user_id != 17 AND t3.dup = 1 AND user_owned.id IS NULL GROUP BY t3.user_id, t1.user_name ORDER BY COUNT(DISTINCT t2.id) DESC;
关键修正点说明
- 排除目标用户已拥有的物品:通过
LEFT JOIN关联目标用户的拥有记录,并用IS NULL筛选出未匹配的物品,比NOT IN更稳定(避免子查询出现NULL值导致的逻辑错误)。 - 去重处理:使用
DISTINCT确保同一个物品不会在单个用户的列表中重复出现(因为同一物品可能有多条dup=1的记录)。 - 关联修正:你的原有SQL中误写了
accounts表,这里修正为正确的table1用户表关联。
内容的提问来源于stack exchange,提问作者i_dont_know_anything_YET
相关产品推荐
相关产品推荐

