Mysql
在“訂單”中加入“最新匹配”
很難解釋我的場景和我想要完成的事情。我有兩張這樣的表,我已經減少了我的場景的值
Table1 +----------------------+ | ID | Time | +----------------------+ | 1 | 2018-05-15 09:00 | | 1 | 2018-05-15 09:10 | | 1 | 2018-05-15 09:20 | | 2 | 2018-05-15 09:30 | | 2 | 2018-05-15 09:40 | +----------------------+ ` ` Table2 +----------------------+ | ID | Time | +----------------------+ | 1 | 2018-05-15 09:21 | | 1 | 2018-05-15 09:31 | | 2 | 2018-05-15 09:41 | +----------------------+
我想在 ID 上加入這些,但在最新結果上匹配。通過這個,我希望 Table1 中的最新匹配 ID 與表 2 的 ID 的最新匹配加入。因此,如果我有兩個表中的 ID 匹配,我希望最新日期顯示在結果中並指定它來自其他表。一旦使用,下一場比賽將獲得最新的未使用日期。不熟悉循環遍歷結果來處理這種情況
我想從上述查詢中產生的輸出(第三列表示該行的來源):
+----------------------+--------+ | ID | Time | Table | +----------------------+--------+ | 1 | 2018-05-15 09:00 | Table1 | | 1 | 2018-05-15 09:21 | Table2 | | 1 | 2018-05-15 09:31 | Table2 | | 2 | 2018-05-15 09:30 | Table1 | | 2 | 2018-05-15 09:41 | Table2 | +----------------------+--------+
如果可以升級到 MariaDB 版本 10.2,則可以使用視窗函式。
以下假設
table1
具有 - 對於每個id
- 相同或更多的行table2
:WITH t1 AS ( SELECT id, time, row_number() OVER (PARTITION BY id ORDER BY time DESC) AS rn FROM table1 ), t2 AS ( SELECT id, time, row_number() OVER (PARTITION BY id ORDER BY time DESC) AS rn FROM table2 ) SELECT t1.id, CASE WHEN t2.time IS NULL OR t1.time >= t2.time THEN t1.time ELSE t2.time END AS time, CASE WHEN t2.time IS NULL OR t1.time >= t2.time THEN 'table1' ELSE 'table2' END AS "table" FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND t1.rn = t2.rn ORDER BY id, t1.rn DESC ;
在**dbfiddle.uk測試**