连接 3 个返回混合结果的表 (mysql)

Joining 3 tables returning mixed results (mysql)

我有 3 张桌子:

EMPLEADOS 阿尔塔斯 巴哈斯

这是一些示例数据:

EMPLEADOS

+-------------+------------+-------------+
| id_empleado | nombres    | ap_paterno  |
+-------------+------------+-------------+
| 1020        | JUAN       | FUENTES     |
+-------------+------------+-------------+
| 1021        | JOSE       | FLORES      |
+-------------+------------+-------------+

阿尔塔斯

+-------------+--------------+-------------+-----------+
| id_alta     | id_empleado  | fecha_alta  | tipo      |
+-------------+--------------+-------------+-----------+
| 958         | 1020         | 2015-02-27  | ALTA      |
+-------------+--------------+-------------+-----------+
| 961         | 1020         | 2015-02-26  | REINGRESO |
+-------------+--------------+-------------+-----------+
| 972         | 1020         | 2015-03-19  | REINGRESO |
+-------------+--------------+-------------+-----------+
| 1003        | 1020         | 2015-05-19  | REINGRESO |
+-------------+--------------+-------------+-----------+

巴哈斯

+-------------+--------------+-------------+--------------+------------+
| id_baja     | id_empleado  | id_motivo   | fecha_baja   |finiquitado |
+-------------+--------------+-------------+--------------+------------+
| 896         | 1020         | 1           | 2015-03-12   | 0          |
+-------------+--------------+-------------+--------------+------------+
| 909         | 1020         | 1           | 2015-03-30   | 1          |
+-------------+--------------+-------------+--------------+------------+

我正在使用以下查询:

SELECT 
    EMPLEADOS.id_empleado, ALTAS.id_alta, 
    ALTAS.fecha_alta, ALTAS.tipo, 
    BAJAS.id_baja, BAJAS.fecha_baja 
    FROM EMPLEADOS 
    LEFT JOIN ALTAS ON EMPLEADOS.id_empleado = ALTAS.id_empleado
    LEFT JOIN BAJAS ON EMPLEADOS.id_empleado = BAJAS.id_empleado
WHERE EMPLEADOS.id_empleado = 1020
GROUP BY ALTAS.fecha_alta, BAJAS.fecha_baja
ORDER BY fecha_alta DESC, fecha_baja DESC

我得到了这个结果:

+-------------+---------+------------+----------+---------+------------+
| id_empleado | id_alta | fecha_alta | tipo     | id_baja | fecha_baja |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 1003    | 2015-05-19 | REINGRESO| 909     | 2015-03-30 |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 1003    | 2015-05-19 | REINGRESO| 896     | 2015-03-12 |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 972     | 2015-03-19 | REINGRESO| 909     | 2015-03-30 |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 972     | 2015-03-19 | REINGRESO| 895     | 2015-03-12 |

...等等最多 8 个结果(将所有 ALTAS (4) 与 BAJAS (2) 表格信息混合)

当期望的结果是:

+-------------+---------+------------+----------+---------+------------+
| id_empleado | id_alta | fecha_alta | tipo     | id_baja | fecha_baja |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 1003    | 2015-05-19 | REINGRESO|         |            |
+-------------+---------+------------+----------+---------+------------+
| 1020        |         |            |          | 909     | 2015-03-30 |
+-------------+---------+------------+----------+---------+------------+
| 1020        | 972     | 2015-03-19 | REINGRESO|         |            |

...依此类推最多6个结果(4个ALTAS数据和2个BAJAS数据)

为什么我的查询是错误的?

您需要对每个 table 进行单独的联接,然后将它们与 UNION 合并。使用 NULL 作为其他 table.

列的占位符
SELECT * FROM (
    SELECT e.id_empleado, a.id_alta, a.fecha_alta, NULL AS id_baja, NULL AS fecha_baja
    FROM EMPLEADOS AS e
    LEFT JOIN ALTAS AS a ON e.id_empleado = a.id_empleado
    WHERE e.id_empleado = 1020
    UNION ALL
    SELECT e.id_empleado, NULL, NULL, b.id_baja, b.fecha_baja
    FROM EMPLEADOS AS e
    LEFT JOIN BAJAS AS b ON e.id_empleado = b.id_empleado
    WHERE e.id_empleado = 1020
) AS u
ORDER BY fecha_alta DESC, fecha_baja DESC

DEMO

建议: 您将需要 运行 它与每个 table 分开并使用 union 附加数据。 在加入 Altas 时将列值(来自 bajas 的列)保持为 Null,反之亦然..