You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键修正点说明

  1. 排除目标用户已拥有的物品:通过LEFT JOIN关联目标用户的拥有记录,并用IS NULL筛选出未匹配的物品,比NOT IN更稳定(避免子查询出现NULL值导致的逻辑错误)。
  2. 去重处理:使用DISTINCT确保同一个物品不会在单个用户的列表中重复出现(因为同一物品可能有多条dup=1的记录)。
  3. 关联修正:你的原有SQL中误写了accounts表,这里修正为正确的table1用户表关联。

内容的提问来源于stack exchange,提问作者i_dont_know_anything_YET

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:57:26