0

例如给定这张表

编号 | 类别

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

4

2 回答 2

2

@Quassnoi 写了几篇关于这个主题的非常有用的博客文章,得出的结论是,如果你有一个复合索引,以下内容将非常高效(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,1LIMIT 3,1。更一般地说:要选择前n条记录,请更改LIMIT 1,1为.LIMIT n-1,1

于 2012-09-17T09:48:13.467 回答
1

要从每个组中找到前 N 个,请尝试以下指南:http ://thenoyes.com/littlenoise/?p=36

于 2012-09-16T19:10:15.597 回答