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

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

最佳答案

@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,1LIMIT 3,1 。更一般地说:要选择前 n 条记录,请更改 LIMIT 1,1LIMIT <em>n-1</em>,1 .

关于mysql - 从每个类别中选择几个小ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449819/

相关文章:

mysql - 为什么 SQL NOT IN() 运算符不起作用?

php - 如何在 PHP 应用程序中打印 mysql 中的行号

javascript - 当项目进入选择框时如何获取数据?

mysql - 合并两个表

c# - 跨站点连接 MySQL 数据库

php - HighCharts Basic 线不显示线

php - 需要一个循环发送功能的想法

php - 从 Android 到 MySQL Blob 的图像

mysql - 如何从表中选择不在select查询结果中的记录(select查询可能是2个或更多表的连接)

mysql - 如何获得 TreeView ?数据库