【问题标题】:MySQL: Select penult valuesMySQL:选择倒数第二个值
【发布时间】:2021-04-01 07:21:11
【问题描述】:

有2张桌子:

表1:

id  |phone| order|
 ---|-----|------|
  1 | 122 |  6   |
  2 | 122 |  4   |
  3 | 122 |  3   |
  4 | 123 |  6   |
  5 | 123 |  5   |
  6 | 123 |  3   |   
  7 | 124 |  6   |
  8 | 124 |  5   |
  9 | 125 |  6   |
  10| 125 |  5   |

表2:

|phone |
|------|
|122   |
|123   |
|124   |

我必须根据下一个条件选择 id 和最后一个订单:

  • 如果订单不等于 3,则使用此手机的最大 id 值获取行
  • 如果 order 等于 3,则获取此手机的 pre-max id
  • ID 在表 2 中。

所以结果应该是:

|phone  | order|
|------ |------|
|122    | 4    |
|123    | 5    |
|124    | 5    |

MySQL 版本:Ver 15.1 Distrib 5.5.64-MariaDB

【问题讨论】:

  • 如何建立“最后一个” - 是否有 auto_increment 列、日期或其他有帮助的内容?

标签: sql mariadb subquery sql-order-by


【解决方案1】:

基本上你想看看最后两条记录;如果最后一条记录有订单3,则使用前一条。

如果您的旧 MySQL 版本不支持这些功能,那将是一个带有窗口函数和/或横向连接的简单查询。用户变量是一个选项,正如 nbk 所展示的那样,但它们使用起来很棘手 - 而且 MySQL 8.0 宣布此功能将在未来的版本中被弃用。

我将推荐相关子查询和一些逻辑:

select t2.id,
    coalesce(
        nullif((select ord from table1 t1 where t1.id = t2.id order by odering_id desc limit 1), 3),
        (select ord from table1 t1 where t1.id = t2.id order by odering_id desc limit 1, 1)
    ) as ord
from table2 t2

第一个子查询获取最新的值; nullif()检查返回值,如果有订单则返回null3;这表明coalesce() 它应该返回第二个子查询的结果,即获取前一个值。

order 是语言关键字,所以我改用了ord。

Demo in MySQL 5.5:

编号 |秩序 --: | --: 122 | 4 123 | 5 124 | 5

【讨论】:

    【解决方案2】:

    你的 mariadb 版本有点旧

    Thta 将使用按order 列排序的行号,并且只会选择第二个。

    需要子查询中的 LIMIT,因为 mariadb 遵循标准,不会对子查询进行排序。

    CREATE TABLE Table1
        (`id` int, `order` int)
    ;
        
    INSERT INTO Table1
        (`id`, `order`)
    VALUES
        (122, 6),
        (122, 4),
        (122, 3),
        (123, 6),
        (123, 5),
        (123, 3),
        (124, 6),
        (124, 5),
        (125, 6),
        (125, 5)
    ;
    
    CREATE TABLE Table2
        (`id` int)
    ;
        
    INSERT INTO Table2
        (`id`)
    VALUES
        (122),
        (123),
        (124)
    ;
    
    SELECT id,`order`
    FROM (SELECT 
    
     t1.`order`
    , IF ( @id = t1.id ,@rn := @rn +1, @rn:= 1) AS rownum
    , @id := t1.`id` as id
    FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id,(SELECT @id := 0,@rn := 0) t3
    ORDEr BY t1.id,t1.`order` DESC LIMIT 18446744073709551615) t4
    WHERE rownum = 2
        
    
    编号 |命令 --: | ----: 122 | 4 123 | 5 124 | 5

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2019-12-18
      • 2017-04-07
      • 2021-07-10
      相关资源
      最近更新 更多