我有兩張桌子:
流程
| 行程號 | 資料 |
|---|---|
| 1 | XXX |
| 2 | XXX |
| ... | ... |
追蹤:
| 跟蹤 | 行程號 |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| ... | ... |
需要來自每個 idProcess 的最后兩個 idTrace,按 idTrace 降序排列:
| 跟蹤 | 行程號 |
|---|---|
| 3 | 1 |
| 2 | 1 |
| 7 | 2 |
| 6 | 2 |
| ... | ... |
編輯 可以是在跟蹤中尚不存在的行程中的行...
uj5u.com熱心網友回復:
MySQL5.x 可以使用相關子查詢來查找要加入的行。
SELECT
*
FROM
Processes p
LEFT JOIN
Tracings t
ON t.idProcess = p.idProcess
AND t.yourTimestampColumn >= (
SELECT yourTimestampColumn
FROM Tracings
WHERE idProcess = p.idProcess
ORDER BY yourTimestampColumn DESC
LIMIT 1 OFFSET 1
)
演示:https : //www.db-fiddle.com/f/q1YCHFwX3zLiZ6xd52TdN6/0
- 歸功于@ggordon,他是我采用的演示
uj5u.com熱心網友回復:
由于您在問題中共享的所需輸出僅包含 Tracings 表中的列,因此您無需使用連接,而僅包含 Tracing 表以提高效率。
架構 (MySQL v5.5)
以下方法使用變數來確定順序,并使用 where 子句來限制有序行號。
SET @row_num:=0;
SET @prev_grp:=NULL;
SELECT
t.idTrace,
t.idProcess
FROM (
SELECT
*,
@row_num:=(
CASE
WHEN @prev_grp<>idProcess THEN 1
ELSE @row_num 1
END
) as rn,
@prev_grp:=idProcess
FROM
Tracings
ORDER BY
idProcess,idTrace DESC
) t
WHERE rn <=2
ORDER BY t.idProcess,t.idTrace DESC;
或作為一個查詢
SELECT
t.idTrace,
t.idProcess
FROM (
SELECT
*,
@row_num:=(
CASE
WHEN @prev_grp<>idProcess THEN 1
ELSE @row_num 1
END
) as rn,
@prev_grp:=idProcess
FROM
Tracings
CROSS JOIN (SELECT @row_num:=0,@prev_grp:=NULL) as vars
ORDER BY
idProcess,idTrace DESC
) t
WHERE rn <=2
ORDER BY t.idProcess,t.idTrace DESC;
| 跟蹤 | 行程號 |
|---|---|
| 3 | 1 |
| 2 | 1 |
| 7 | 2 |
| 6 | 2 |
在 DB Fiddle 上查看
架構 (MySQL v8.0)
您也可以使用ROW_NUMBER來實作這一點,例如。
CREATE TABLE Processes (
`idProcess` INTEGER,
`data` VARCHAR(5)
);
INSERT INTO Processes
(`idProcess`, `data`)
VALUES
('1', 'XXXX'),
('2', 'XXXXX');
CREATE TABLE Tracings (
`idTrace` INTEGER,
`idProcess` INTEGER
);
INSERT INTO Tracings
(`idTrace`, `idProcess`)
VALUES
('1', '1'),
('2', '1'),
('3', '1'),
('4', '2'),
('5', '2'),
('6', '2'),
('7', '2');
查詢#1
SELECT
idTrace,
idProcess
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY idProcess
ORDER BY idTrace DESC
) rn
FROM
Tracings
) t
WHERE rn <=2
ORDER BY t.idProcess,t.idTrace DESC;
| 跟蹤 | 行程號 |
|---|---|
| 3 | 1 |
| 2 | 1 |
| 7 | 2 |
| 6 | 2 |
查詢 #2 - 如果您需要 Processes 表中的資料
SELECT
t.idTrace,
t.idProcess,
p.data
FROM
Processes p
INNER JOIN (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY idProcess
ORDER BY idTrace DESC
) rn
FROM
Tracings
) t ON p.idProcess = t.idProcess
WHERE rn <=2
ORDER BY t.idProcess,t.idTrace DESC;
| 跟蹤 | 行程號 | 資料 |
|---|---|---|
| 3 | 1 | XXX |
| 2 | 1 | XXX |
| 7 | 2 | XXXXX |
| 6 | 2 | XXXXX |
查看 DB Fiddle 讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315241.html
上一篇:基于嵌套成員資格有條件地連接R表
