如何查询所有店铺在售商品?SQL语句问题排查
解决:查询所有店铺均售卖的商品
嗨,我来帮你捋捋这个问题~你想找出所有店铺都在售卖的商品,思路本身是对的——先统计总店铺数,再筛选出被所有店铺覆盖的商品,但你的SQL没生效,主要是几个小细节没处理好,我给你拆解一下:
首先先看你的原SQL:
select product_id, product_name from sales join shops on sales.shopsid = shops.id group by(product_id, product_name) having count(shop_name) = 10;
问题出在哪?
- 字段名拼写错误:你的sales表字段是
shops_id,但你写的是sales.shopsid(少了下划线),这会导致关联失败,根本匹配不到正确的店铺数据。 - 未去重计数:
count(shop_name)会把同一个店铺多次销售该商品的记录都算进去(比如某店卖了5次这个商品,count就会加5),而不是统计唯一的店铺数量,这样即使商品在10家店都卖过,count结果可能远大于10,自然筛选不出来。 - 硬编码店铺数:直接写死
=10不够灵活,如果店铺数量变化(比如新增或关闭店铺),你就得手动修改SQL,不够鲁棒。
修正后的正确SQL
我给你两种写法,按需选择:
写法一:关联shops表(适合需要确认店铺有效性的场景)
SELECT product_id, product_name FROM sales JOIN shops ON sales.shops_id = shops.id -- 修正字段名错误 GROUP BY product_id, product_name HAVING COUNT(DISTINCT shops.id) = (SELECT COUNT(*) FROM shops); -- 动态获取总店铺数+去重计数
写法二:直接用sales表(更高效,前提是sales.shops_id为有效外键)
因为sales表已经有shops_id,如果这个字段是关联shops.id的合法外键,其实不需要关联shops表,直接统计即可:
SELECT product_id, product_name FROM sales GROUP BY product_id, product_name HAVING COUNT(DISTINCT shops_id) = (SELECT COUNT(*) FROM shops);
为什么这样写?
COUNT(DISTINCT shops.id)(或COUNT(DISTINCT shops_id))确保每个店铺只被统计一次,不管它卖这个商品多少次。- 子查询
(SELECT COUNT(*) FROM shops)动态获取当前的总店铺数,不用硬编码数字,店铺数量变化时SQL依然有效。
这样就能准确返回所有店铺都在售的商品ID和名称啦~
内容的提问来源于stack exchange,提问作者Sachihiro
相关产品推荐
相关产品推荐

