Mysql 从每个类别中选择几个小ID

Mysql 从每个类别中选择几个小ID,mysql,Mysql,例如,给定此表 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,即我们需要这个结果 一, 二, 五, 六, 八, 九, 我写了这个问题和他的作品 SELECT MIN(id) AS id FROM mytable GROUP BY category UNION SELECT MIN(

例如,给定此表

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,即我们需要这个结果

一,

二,

五,

六,

八,

九,

我写了这个问题和他的作品

        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,查询将非常困难。
有人有想法,如何使这变得容易?

要从每个组中找到前N名,请尝试以下指南:

要从每个组中找到前N名,请尝试以下指南:

@Quassnoi就这个主题写了几篇内容丰富的文章,得出结论,如果你对类别id有一个复合索引,那么以下内容将非常有效:

在电视上看


要选择前4条记录,请将限制1,1更改为限制3,1。更一般地说:要选择前n条记录,请将限制1,1更改为限制n-1,1。

@Quassnoi就这一主题写了几篇内容丰富的文章,得出结论,如果您对类别id有一个复合索引,那么以下内容将非常有效:

在电视上看

要选择前4条记录,请将限制1,1更改为限制3,1。更一般地说:要选择前n条记录,请将限制1,1更改为限制n-1,1

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)