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尝试
)
留言
張貼留言