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

时间:2012-09-16 19:06:48

标签: 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,即我们需要此结果

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个),查询将非常困难。 有人有想法,怎么能让这个变得容易?

2 个答案:

答案 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