mysql选择具有前3个最大值的所有记录
我有一个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 30mysql选择具有前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
你也可以这样做
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;