Mysql SQL:从两个具有大量行的userid中选择所有行

Mysql SQL:从两个具有大量行的userid中选择所有行,mysql,sql,Mysql,Sql,我希望从行数最多的两个用户(即日志表中活动最多的两个用户)获取所有行 我只找到了下一个解决方案:首先,获取每个用户的行数,将其限制为2: SELECT userid, count(*) AS n_of_rows FROM my_table GROUP BY userid LIMIT 2; 然后,从源代码中查询数据库Python,例如,查询数据库以获取每个用户的行: SELECT * FROM my_table where userid = $userid 考虑到SQL语言本身和数据库性能,它

我希望从行数最多的两个用户(即日志表中活动最多的两个用户)获取所有行

我只找到了下一个解决方案:首先,获取每个用户的行数,将其限制为2:

SELECT userid, count(*) AS n_of_rows FROM my_table GROUP BY userid LIMIT 2;
然后,从源代码中查询数据库Python,例如,查询数据库以获取每个用户的行:

SELECT * FROM my_table where userid = $userid
考虑到SQL语言本身和数据库性能,它是最佳/优雅的解决方案吗

谢谢

试试这个:

SELECT TOP 2 userid, count(*) AS n_of_rows 
FROM my_table 
GROUP BY userid 
ORDER BY count(*) desc
试试这个:

SELECT TOP 2 userid, count(*) AS n_of_rows 
FROM my_table 
GROUP BY userid 
ORDER BY count(*) desc

我想你要找的是

select * from my_table where userid in
(select userid from my_table
 group by userid
 order by count(*) desc
 limit 2)

我想你要找的是

select * from my_table where userid in
(select userid from my_table
 group by userid
 order by count(*) desc
 limit 2)

要获取行并保持顺序,请使用带聚合的联接:

select t.*
from my_table t join
     (select userid, count(*) as cnt
      from my_table
      group by userid
      order by count(*) desc
      limit 2
     ) top2
     on t.userid = top2.userid
order by top2.cnt desc, userid;

要获取行并保持顺序,请使用带聚合的联接:

select t.*
from my_table t join
     (select userid, count(*) as cnt
      from my_table
      group by userid
      order by count(*) desc
      limit 2
     ) top2
     on t.userid = top2.userid
order by top2.cnt desc, userid;

选择Top2是SQL Server语法-问题是关于MySQL的。选择Top2是SQL Server语法-问题是关于MySQL的。此查询是否保持嵌套查询的顺序?我的意思是,结果将首先包含来自行数最多的用户的所有行,然后是来自第二个用户的行?您当然可以在最后一个括号后添加order by userid。当我测试时,它确实保留了这个顺序,但后来我在SQL Server中测试了等效的查询,因为我手头没有mySQL。我不想在主选择中按用户进行排序,而是按DESC行数最多的用户进行排序。这个顺序会像在嵌套查询中一样保留在主查询中吗?哦,是的。正如我所说的,当我在SQLServer中测试时,行是按照用户ID的顺序出现的,也就是说,按照行数最多的用户的顺序出现的。但是你应该在mySQL中进行测试,我刚刚在mySQL中进行了测试,没有遵守顺序。行保持表中行的顺序,因此第一组行不属于具有更多行的用户,而是属于表中的第一个用户。所以原则上,这个解决方案对我来说并不合适。除了我提供的解决方案之外,还有其他的解决方案吗?这个查询会保持嵌套查询的顺序吗?我的意思是,结果将首先包含来自行数最多的用户的所有行,然后是来自第二个用户的行?您当然可以在最后一个括号后添加order by userid。当我测试时,它确实保留了这个顺序,但后来我在SQL Server中测试了等效的查询,因为我手头没有mySQL。我不想在主选择中按用户进行排序,而是按DESC行数最多的用户进行排序。这个顺序会像在嵌套查询中一样保留在主查询中吗?哦,是的。正如我所说的,当我在SQLServer中测试时,行是按照用户ID的顺序出现的,也就是说,按照行数最多的用户的顺序出现的。但是你应该在mySQL中进行测试,我刚刚在mySQL中进行了测试,没有遵守顺序。行保持表中行的顺序,因此第一组行不属于具有更多行的用户,而是属于表中的第一个用户。所以原则上,这个解决方案对我来说并不合适。除了我提供的解决方案之外,还有其他解决方案吗?我刚刚在MySQL中测试过,但不起作用。嵌套查询以正确的顺序返回userid,但最终结果返回的行考虑了表中的顺序,而不是从最大行数到最小行数。我的意思是,第一行是针对userid 1的,但是userid 2是行数最多的一行,但是似乎,当userid 1首先出现时,整个查询首先返回userid 1的行,然后返回userid 2的行。@David。它不起作用的原因是order by的排序顺序错误。我刚刚在MySQL中测试了它,但不起作用。嵌套查询以正确的顺序返回userid,但最终结果返回的行考虑了表中的顺序,而不是从最大行数到最小行数。我的意思是,第一行是针对userid 1的,但是userid 2是行数最多的一行,但是似乎,当userid 1首先出现时,整个查询首先返回userid 1的行,然后返回userid 2的行。@David。它不起作用的原因是order by按错误的顺序排序。