【问题标题】:sql order by based on two columns values基于两列值的sql排序
【发布时间】: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 anandgautham 按名称排序。但在gautham 之前添加与altos 具有相同值的所有行

标签: mysql sql sql-order-by


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多