Mysql

在“訂單”中加入“最新匹配”

  • July 1, 2018

很難解釋我的場景和我想要完成的事情。我有兩張這樣的表,我已經減少了我的場景的值

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測試**

引用自:https://dba.stackexchange.com/questions/210989