mysql选择具有前3个最大值的所有记录

mysql选择具有前3个最大值的所有记录,mysql,Mysql,我有一个mysql表,我想得到所有最高工资前三名的记录 userid salary 1 10 2 20 3 20 4 30 5 10 6 50 7 40 8 50 9 30 10 20 结果应为3个最大值的所有记录,即: userid salary 8 50 6

我有一个mysql表,我想得到所有最高工资前三名的记录

userid salary 1 10 2 20 3 20 4 30 5 10 6 50 7 40 8 50 9 30 10 20 结果应为3个最大值的所有记录,即:

userid salary 8 50 6 50 7 40 9 30 4 30
你也可以这样做

SELECT t.*
  FROM t 
 WHERE FIND_IN_SET(salary,(SELECT GROUP_CONCAT(salary ORDER BY salary DESC) FROM t))  <= 4
 ORDER 
    BY salary DESC
     , userid DESC;
。。。虽然我怀疑这会更快

SELECT userid
     , salary
  FROM
     ( SELECT t.*
            , CASE WHEN @prev = salary THEN @i:=@i ELSE @i:=@i+1 END rank
            , @prev := salary
         FROM t
            , (SELECT @i:=0, @prev:=null) vars
        ORDER 
           BY salary DESC
            , userid DESC
     ) x
 WHERE rank <= 3;

也不起作用,子查询中的IN子句不支持限制。TILL不起作用,它只提供3条记录,但我希望所有记录都具有3条最高工资,如上文所述。distinct缺失。是的,它起作用,谢谢。同一查询中还有一个问题。请注意,我现在使用“sal”作为“salar”的别名,并希望与“where”一起使用。但它不起作用。请帮助我,你可以使用内部选择的别名。但是从您的_表中选择*,其中sal in不起作用,因为您不是指内部选择的sal。你是说从外部选择的薪水。
SELECT userid
     , salary
  FROM
     ( SELECT t.*
            , CASE WHEN @prev = salary THEN @i:=@i ELSE @i:=@i+1 END rank
            , @prev := salary
         FROM t
            , (SELECT @i:=0, @prev:=null) vars
        ORDER 
           BY salary DESC
            , userid DESC
     ) x
 WHERE rank <= 3;