如何先获取ITEM_PRICE表中仅出现一次的ITEM_ID再筛选价格等于10的记录
解决方法:先筛选唯一出现的ITEM_ID,再过滤价格
我明白你的需求啦——你要的是在整个ITEM_PRICE表里只出现一次,并且价格等于10的ITEM_ID,而不是价格为10的记录里的去重ID。你的原语句逻辑顺序搞反了,咱们调整一下SQL的执行逻辑:
方法1:使用子查询+IN
SELECT item_id FROM item_price WHERE price = 10 AND item_id IN ( -- 先找出整个表中仅出现一次的ITEM_ID SELECT item_id FROM item_price GROUP BY item_id HAVING COUNT(*) = 1 );
方法2:使用JOIN关联子查询
SELECT ip.item_id FROM item_price ip -- 关联仅出现一次的ITEM_ID集合 JOIN ( SELECT item_id FROM item_price GROUP BY item_id HAVING COUNT(*) = 1 ) unique_items ON ip.item_id = unique_items.item_id WHERE ip.price = 10;
逻辑解释
- 子查询部分:
GROUP BY item_id会把相同的ITEM_ID分组,HAVING COUNT(*) = 1只保留那些分组后只有1条记录的ITEM_ID,也就是整个表中仅出现一次的ID。 - 外层查询:要么用
IN把这些唯一ID筛选出来,再加上price = 10的条件;要么用JOIN关联后过滤价格,最终得到的就是既只出现一次,价格又为10的ITEM_ID。
对比原语句的问题
你原来的SELECT distinct item_id from item_price where price = 10是先筛选价格为10的记录,再对这些记录里的ITEM_ID去重。但这些ID可能在表的其他非价格10的记录里还存在,所以完全不符合你“仅在数据库中存在一次”的核心要求。
内容的提问来源于stack exchange,提问作者Alan3212
相关产品推荐
相关产品推荐

