多表关联查询结果异常:获取最近更新商品的商家问题
解决获取最近有商品更新的前9个商家的问题
你遇到的问题核心在于:直接用DISTINCT去重并排序,和关联查询时没有先聚合每个商家的最新商品更新时间,导致两个结果集不一致。我来帮你拆解原因并给出正确的SQL写法:
为什么原有语句会出现不一致?
你的初始语句:
SELECT distinct business_id FROM items ORDER BY items.updated_at desc limit 9
这里的逻辑是先把所有商品按更新时间倒序排列,再去重得到商家ID。但这里有个潜在问题:如果一个商家有多个商品,排序是基于单个商品的更新时间,而非该商家最新的商品更新时间(虽然大部分情况下结果看似正确,但逻辑不严谨)。
而你尝试的关联查询如果直接关联items表,会返回每个商家的多条商品记录(对应多个更新时间),这时如果直接排序取LIMIT 9,会包含重复的商家,自然和去重后的结果不一致。
正确的SQL写法
我们需要先聚合每个商家的最新商品更新时间,再按这个时间排序取前9个商家,最后关联商家表获取完整信息:
SELECT b.*, latest_items.last_updated FROM businesses AS b INNER JOIN ( -- 子查询:获取每个商家的最新商品更新时间 SELECT business_id, MAX(updated_at) AS last_updated FROM items GROUP BY business_id -- 按最新更新时间倒序,取前9个商家 ORDER BY last_updated DESC LIMIT 9 ) AS latest_items ON b.id = latest_items.business_id -- 可以保留按最新更新时间排序(可选,因为子查询已经排过序,但不同数据库可能需要) ORDER BY latest_items.last_updated DESC;
这个写法的优势:
- 子查询先通过
GROUP BY business_id和MAX(updated_at),确保每个商家只保留一条记录,对应它的最新商品更新时间 - 先排序取前9个商家,再关联商家表,避免了关联后出现重复商家的问题
- 逻辑清晰,结果和你初始期望的“最近有商品更新的前9个商家”完全匹配
如果你想验证初始语句和这个写法的差异,可以对比子查询返回的business_id列表和你初始语句的结果,就能看到是否因为单个商品排序导致的逻辑偏差。
内容的提问来源于stack exchange,提问作者zen
相关产品推荐
相关产品推荐

