使用mysql选择前N个*组*
为了简单起见,假设我有一个表,其中有两个字段-PERSON\u NAME和COMPANY\u ID,这两个字段是成对的:使用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
('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)
上有索引,那么查询应该运行得更快。