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

如何查询所有店铺在售商品?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:13:45