使用mysql选择前N个*组*

使用mysql选择前N个*组*,mysql,Mysql,为了简单起见,假设我有一个表,其中有两个字段-PERSON\u NAME和COMPANY\u ID,这两个字段是成对的: ('a',1) ('b',1) ('c',2) ('d',2) ('e',3) 姓名a和b在公司ID 1工作,依此类推 我想为前2个(或N个)公司选择所有行- ('a',1) ('b',1) ('c',2) ('d',2) 我不知道每个公司ID有多少行 GROUP BY在此不起作用,因为我需要每个公司ID中的所有行。 这个有效- SELECT * FROM T WHERE

为了简单起见,假设我有一个表,其中有两个字段-PERSON\u NAME和COMPANY\u ID,这两个字段是成对的:

('a',1) ('b',1) ('c',2) ('d',2) ('e',3)
姓名a和b在公司ID 1工作,依此类推

我想为前2个(或N个)公司选择所有行-

('a',1) ('b',1) ('c',2) ('d',2)
我不知道每个公司ID有多少行

GROUP BY在此不起作用,因为我需要每个公司ID中的所有行。
这个有效-

SELECT * FROM T
WHERE COMPANY_ID in (SELECT DISTINCT COMPANY_ID
                     FROM T
                     ORDER BY 1 DESC
                     LIMIT N)

但由于绩效是一个问题,这还不够(大约有2.5万家公司,每家公司约有5-15人)。N通常为500。

将其作为联接执行:

SELECT T.*
FROM T join
     (SELECT DISTINCT COMPANY_ID
      FROM T
      ORDER BY 1 DESC
      LIMIT N
     ) TN
     on TN.COMPANY_ID = T.COMPANY_ID;

显式连接通常比
where
子句中的
执行得更好。

在我的例子中,它只是稍微快一点。我希望有“限制不同公司ID 300”…@user1248826。如果在
T(COMPANY\u ID)
上有索引,那么查询应该运行得更快。