例如给定此表
id |类别
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),查询将非常困难。 有人有想法,如何才能使这变得容易?
最佳答案
@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 <em>n-1</em>,1
.
关于mysql - 从每个类别中选择几个小ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449819/