mysql分组取每组前N条记录

goods_id   category_id   price  
1 101 12
2 101 25
3 666 38
4 666 95
5 666 27
6 8888 18
7 8888 81
8 8888 98
9 8888 37
10 101 68
11 101 36
12 666 88
13 8888 33
表形如这样,表名goods,存储了每个商品的价格和商品的分类,现在要获得每个种类价格最贵的3个商品,mysql没有row_number() over(partition by XXX order by XXX DESC),一种方案就是用变量编号实现oracle row_number()的功能,但是这种涉及到子表,另外还有一种不用子表的实现方式如下:
SELECT *
FROM goods a
WHERE (SELECT count(*) FROM goods WHERE category_id = a.category_id AND price > a.price) < 3
这个其实看起复杂,实则很好理解
先看一般的where条件
SELECT *
FROM goods a
WHERE a.category_id = 8888 and a.price >= 80
一般的where条件就是在所有record中找出那些满足该条件的。同理,把这种简单条件变成一个子查询条件,也是从所以record中满足这个表达式的(一条record一条record尝试

留言

熱門文章