首页 > 解决方案 > 合并两个 MySQL 表而不重复(上一个主题没有提供解决方案)

问题描述

我在这里处于理智的边缘。在发布我的问题之前,我已经查看了可能的解决方案,但我找不到任何可以解决我的问题的方法。

我有三个具有以下布局的表:

     Employee                User_logs                        Assessment
|----------------| |----------------------|-------| |----------------------|-------|
| empID  | uName | | checkindate | status | FK_ID | | asDate     |saResult | FK_ID |
|----------------| |----------------------|-------| |----------------------|-------|
| 1      | Tino  | | 2020-04-04  | Clear  |   1   | | 2020-04-04 | Pass    |   1   |
| ...    | ...   | | 2020-05-05  | Fail   |   1   | | 2020-05-05 | Pass    |   1   |
| ...    | ...   | | 2020-07-07  | Fail   |   1   | | 2020-06-06 | Fail    |   1   |
| ...    | ...   | | 2020-08-08  | Clear  |   1   | | 2020-08-08 | Pass    |   1   |
| ...    | ...   | |------------------------------| | 2020-09-09 | Pass    |   1   |
|----------------|                                  |------------------------------|

empID 是我在表 User_Logs 和 Assessment 中用作外键的主键。我正在寻找的预期结果如下:

                    Result
| FK_ID  |   resultDate | Status| Result |
|----------------------------------------|
|   1    | 2020-04-04   | Clear | Pass   |
|   1    | 2020-05-05   | Fail  | Pass   |
|   1    | 2020-06-06   |       | Fail   |
|   1    | 2020-07-07   | Fail  |        |
|   1    | 2020-08-08   | Clear | Pass   |
|   1    | 2020-09-09   |       | Pass   |  <---- Not shown
|----------------------------------------|

我确实很接近以下代码,但是由于某种原因,它没有在 2020-09-09 的最后一个条目中出现:

SELECT A.checkindate, A.status, B.saDate, B.saResult
FROM myDatabase.User_logs AS A 
      LEFT JOIN (
        SELECT DISTINCT saDate, saResult, FK_empID
        FROM myDatabase.assesment
      ) AS B 
      ON  B.FK_empID = 1
      AND B.saDate = A.checkindate
WHERE A.FK_empID = 1
ORDER BY A.checkindate DESC

我做错了什么或没有看到?

标签: mysql

解决方案


SELECT e.empID, d.resultDate, u.Status, a.saResult Result 
FROM Employee e
CROSS JOIN ( SELECT checkindate resultDate
             FROM User_logs
           UNION 
             SELECT asDate
             FROM Assessment ) d
LEFT JOIN User_logs u ON e.empID = u.FK_ID AND d.resultDate = u.checkindate
LEFT JOIN Assessment a ON e.empID = a.FK_ID AND d.resultDate = a.asDate
-- WHERE COALESCE(u.Status, a.saResult)
-- ORDER BY empID, resultDate

推荐阅读