group by 之后取前3条数据如何实现?

晨曦遇晓 2019-11-11 06:33:27
最近有一个需求这样的,


通过门店的list id获取每个门店前3件商品,然后根据商品的销量高到低,价格高到低排序

然后表的结构大致如下,只列出主要的几个属性
goods 商品表
id 商品id
merchantid 门店id
goodsname 商品名称

goods_price 商品价格表
id 价格表id
goods_id 商品id
sum_sale 销量
price 价格


需要的结果就是传入一个list的门店id集合 查询出每个门店头三件商品 然后排序规则先销量高到低,其次价格高到低

...全文
1170 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-11-12
  • 打赏
  • 举报
回复
很久没写这种排名的SQL,LZ试试看吧
select a.merchantid, a. goodsname, b.price, b.sum_sale, 
1+(select count(*)
from goods aa, goods_price bb
where aa.id = bb.goods_id
and aa.merchantid = a.merchantid
and bb.sum_sale > b.sum_sale) as rank
from goods a, goods_price b
where a.id = b.good_id
and rank <= 3
order by a.merchantid, b.sum_sale desc, b.price

晨曦遇晓 2019-11-12
  • 打赏
  • 举报
回复
大佬厉害了 太难了 我昨天用的这样的 使用group+GROUP_CONCAT来聚合数据在一排的,然后用SUBSTRING_INDEX来获取前三条,最后的数据格式是这样的 用逗号分隔,商品的详情数据一排使用逗号分隔,然后在程序里切割组合数据的
叶遮沉阳 2019-11-12
  • 打赏
  • 举报
回复
你品,你细品!

select * from (
	select 
		if(@merchid = t.merchantid,@rank := @rank + 1,@rank := 1) as rank
		,@merchid := t.merchantid as merchantid
		,goods_id,goodsname,sum_sale,price 
	from (select @merchid := NULL,@rank := 0) r,(
		select merchantid,goods_id,goodsname,sum_sale,price 
		from goods t1,goods_price t2 where t1.id = t2.goods_id
	) t
	ORDER BY t.merchantid,t.sum_sale desc,t.price desc
) tt
where tt.rank <= 3
;
晨曦遇晓 2019-11-11
  • 打赏
  • 举报
回复
商品价格表做了缩略,是多条数据 商品表1对多价格表

67,543

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧