基于两列值的sql排序
Posted
技术标签:
【中文标题】基于两列值的sql排序【英文标题】:sql order by based on two columns values 【发布时间】:2021-04-22 02:08:19 【问题描述】:ID | name | src |
---|---|---|
1 | sundaresh | 1111 |
2 | altos | 2222 |
3 | anand | 1111 |
4 | gautham | 3333 |
5 | mahindra | 1111 |
6 | Tata | 3333 |
7 | Narayan | 3333 |
8 | Satya | 1111 |
9 | Shiv | 2222 |
10 | Ratan | 2222 |
正如我在上表中提到的,我需要检索如下结果。 (例如 'name' 列与类似的 'src' 列按升序过滤)
ID | name | src |
---|---|---|
2 | altos | 2222 |
10 | Ratan | 2222 |
9 | Shiv | 2222 |
3 | anand | 1111 |
5 | mahindra | 1111 |
8 | Satya | 1111 |
1 | sundaresh | 1111 |
4 | gautham | 3333 |
7 | Narayan | 3333 |
6 | Tata | 3333 |
能够按相似的'src'列和对应的'name'列升序检索数据
SELECT * From Table Order by src,name ASC
【问题讨论】:
能否解释一下排序背后的逻辑我不明白 我也是,为什么1111在2222之后3333之前? 逻辑似乎是“按名称排序,但在具有该值的第一个行之后直接添加具有相同 src 的所有行”。所以altos
anand
和 gautham
按名称排序。但在gautham
之前添加与altos
具有相同值的所有行
【参考方案1】:
如果您使用的是 mysql 8.0+,您可以使用 MIN()
窗口函数:
SELECT *
FROM tablename
ORDER BY MIN(name) OVER (PARTITION BY src),
name
对于以前的版本,在 ORDER BY
子句中使用相关子查询:
SELECT t1.*
FROM tablename t1
ORDER BY (SELECT MIN(t2.name) FROM tablename t2 WHERE t2.src = t1.src),
name
请参阅demo。 结果:
ID | name | src |
---|---|---|
2 | altos | 2222 |
10 | Ratan | 2222 |
9 | Shiv | 2222 |
3 | anand | 1111 |
5 | mahindra | 1111 |
8 | Satya | 1111 |
1 | sundaresh | 1111 |
4 | gautham | 3333 |
7 | Narayan | 3333 |
6 | Tata | 3333 |
【讨论】:
以上是关于基于两列值的sql排序的主要内容,如果未能解决你的问题,请参考以下文章