MySQL:选择倒数第二个值

时间:2020-12-22 15:18:09

标签: sql mariadb subquery sql-order-by

有 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 值的行
  • 如果订单等于 3,则使用此手机的 pre-max id
  • Id 在表 2 中。

所以结果应该是:

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

MySQL 版本:Ver 15.1 Distrib 5.5.64-MariaDB

2 个答案:

答案 0 :(得分:0)

你的 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
    
 id | order
--: | ----:
122 |     4
123 |     5
124 |     5

db<>fiddle here

答案 1 :(得分:0)

基本上你想看最后两条记录;如果最后一条记录有订单 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() 检查返回值,如果有订单null,则返回3;这表明 coalesce() 应该返回第二个子查询的结果,即获取前一个值。

order 是语言关键字,所以我用 ord 代替。

Demo in MySQL 5.5

 id | ord
--: | --:
122 |   4
123 |   5
124 |   5