使用MySQL在特殊位置显示值

问题描述 投票:0回答:1

我有一个简单的表格,但想添加一个代码,以便我可以将特殊结果放在选定的位置。

SELECT * FROM table ORDER BY rating DESC LIMIT 10;

我还有一个名为“位置”的列。如果值为 4,我希望它显示为第四个结果,如果值为 7,则显示为第七行,依此类推。否则我想按评级排序。

这可能吗?也许与 CASE 一起?

我尝试了以下方法

SELECT * FROM table 
    ORDER BY 
    CASE WHEN position = 4 THEN 4
    WHEN position = 9 THEN 9 
    ELSE 0 END,
    rating DESC
LIMIT 10;

这只是隐藏那些值为 4 和 9 的位置。

SELECT * FROM table ORDER BY rating DESC LIMIT 10;

应该给出下表

姓名 评分 位置
迈克·布朗 93 0
约翰·多伊 85 0
亚历克斯·约翰逊 78 0
简·史密斯 72 0
艾米莉·怀特 60 0
莎拉·李 52 4
罗伯特·米勒 49 0
艾玛·戴维斯 39 9
大卫·克拉克 38 0
奥利维亚霍尔 30 0

我更想要一个代码来显示下表

姓名 评分 位置
迈克·布朗 93 0
约翰·多伊 85 0
亚历克斯·约翰逊 78 0
莎拉·李 52 4
简·史密斯 72 0
艾米莉·怀特 60 0
罗伯特·米勒 49 0
大卫·克拉克 38 0
艾玛·戴维斯 39 9
奥利维亚霍尔 30 0
sql mysql sql-order-by
1个回答
0
投票

我认为这可行,但这是一个奇怪的要求。也许最好留给表示层。

获取优先具有位置的序列号(new_ordering)非常简单,然后是实际序列。棘手的一点是当 new_ordering 与实际序列 ex 冲突时打破平局。按评级排列的第 4 行。这是笨拙地处理以优先选择位置等于新排序的位置。

CREATE TABLE employee_ratings (
    Name VARCHAR(50),
    Rating INT,
    Position INT
);

INSERT INTO employee_ratings (Name, Rating, Position) VALUES
('Mike Brown', 93, 0),
('John Doe', 85, 9),
('Alex Johnson', 78, 0),
('Jane Smith', 72, 0),
('Emily White', 60, 0),
('Sarah Lee', 52, 4),
('Robert Miller', 49, 0),
('Emma Davis', 39, 0),
('David Clark', 38, 0),
('Olivia Hall', 30, 0);

with ranked_ratings as (
select *, 
       case when position = 0 then row_number() over ( partition by null order by rating desc )
            else position
         end as new_ordering
  from employee_ratings er
)
select name,
       rating,
       position
  from ranked_ratings rr
 order
    by new_ordering,
       case when position = new_ordering then 1
            else 0
        end;
名字 评分 位置
迈克·布朗 93 0
亚历克斯·约翰逊 78 0
简·史密斯 72 0
莎拉·李 52 4
艾米莉·怀特 60 0
罗伯特·米勒 49 0
艾玛·戴维斯 39 0
大卫·克拉克 38 0
约翰·多伊 85 9
奥利维亚霍尔 30 0
© www.soinside.com 2019 - 2024. All rights reserved.