有 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 和最后一个订单:
所以结果应该是:
|phone | order|
|------ |------|
|122 | 4 |
|123 | 5 |
|124 | 5 |
MySQL 版本:Ver 15.1 Distrib 5.5.64-MariaDB
答案 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
代替。
id | ord --: | --: 122 | 4 123 | 5 124 | 5