例如给出此表
1 | 10
2 | 10
3 | 10
4 | 10
5 | 20
6 | 20
7 | 20
8 | 30
9 | 30
10 | 30
11 | 30
我们希望从每个类别获得前2个小ID,即我们需要此结果
1
2
5
6
8
9
我对这个查询和他的作品进行了讽刺
SELECT MIN(id) AS id FROM mytable GROUP BY category
UNION
SELECT MIN(id) AS id FROM mytable WHERE
id NOT IN (SELECT MIN(id) AS id FROM mytable GROUP BY category) GROUP BY category
ORDER BY id
但是这里有一个问题,如果我们想要每个类别的前2个id,这是有效的,但如果我们想要从每个类别中获得更多的第一个小ID(例如7个),查询将非常困难。 有人有想法,怎么能让这个变得容易?
答案 0 :(得分:2)
@Quassnoi在这个主题上写了几篇非常翔实的blog articles,得出的结论是,如果你在(category, id)
上有一个综合索引,那么下面的内容会非常有用:
SELECT mytable.*
FROM mytable JOIN (
SELECT category, (
SELECT id
FROM mytable
WHERE mytable.category = categories.category
ORDER BY id
LIMIT 1, 1
) AS id
FROM (
SELECT DISTINCT category
FROM mytable
) AS categories
) AS limits ON mytable.category <= limits.category
AND mytable.category >= limits.category
AND IFNULL(mytable.id <= limits.id, TRUE)
在sqlfiddle上查看。
要选择前4条记录,请将LIMIT 1,1
更改为LIMIT 3,1
。更一般地说:要选择第一个 n 记录,请将LIMIT 1,1
更改为LIMIT n-1,1
。
答案 1 :(得分:1)
要查找每个组的前N名,请尝试使用以下指南:http://thenoyes.com/littlenoise/?p=36