多字段排序指的是先按某个字段排序,当该字段相同时,再按另一个字段排序,依此类推。不同语言和场景实现方式略有不同,下面给你常见、实用的几种做法。
SELECT *
FROM 表名
ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC], ...;
-- 先按部门升序,再按工资降序
SELECT *
FROM employee
ORDER BY department ASC, salary DESC;
✅ 排序规则:
department 排序department 相同的情况下,再按 salary 排序sorted() / list.sort()data = [
{"name": "张三", "age": 20, "score": 90},
{"name": "李四", "age": 20, "score": 95},
{"name": "王五", "age": 18, "score": 90},
]
# 先按 age 升序,再按 score 降序
sorted_data = sorted(
data,
key=lambda x: (x["age"], -x["score"])
)
⚠️ 注意:
-x["score"] 只适用于数字类型。
from functools import cmp_to_key
def compare(a, b):
if a["age"] != b["age"]:
return a["age"] - b["age"]
if a["score"] != b["score"]:
return b["score"] - a["score"]
return 0
sorted_data = sorted(data, key=cmp_to_key(compare))
ComparatorCollections.sort(list, (a, b) -> {
int c1 = a.getAge().compareTo(b.getAge());
if (c1 != 0) return c1;
return b.getScore().compareTo(a.getScore()); // 降序
});
list.stream()
.sorted(
Comparator.comparing(Person::getAge)
.thenComparing(Comparator.comparing(Person::getScore).reversed())
)
.collect(Collectors.toList());
data.sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return b.score - a.score;
});
df.sort_values(
by=["age", "score"],
ascending=[True, False],
inplace=True
)
| 场景 | 核心思路 |
|---|---|
| SQL | ORDER BY a ASC, b DESC |
| Python | sorted(key=lambda x: (x.a, -x.b)) |
| Java | Comparator.thenComparing |
| JS | 比较函数逐级判断 |
| Pandas | sort_values(by=[...]) |
如果你能告诉我具体使用场景(数据库 / 编程语言 / 前端 / 后端),我可以给你更贴近实战的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。