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

时间:2015-05-26 19:20:56

标签: mysql left-join

我有3张桌子:

EMPLEADOS ALTAS BAJAS

这是一些示例数据:

EMPLEADOS

+-------------+--------------+-------------+-----------+
| 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 |
+-------------+--------------+-------------+-----------+

ALTAS

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

BAJAS

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 |

我得到了这个结果:

+-------------+---------+------------+----------+---------+------------+
| 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|         |            |

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

当所需结果为:

{{1}}

......等等最多6个结果(4个ALTAS数据和2个BAJAS数据)

为什么我的查询错了?

2 个答案:

答案 0 :(得分:3)

您需要对每个表执行单独的连接,然后将它们与UNION结合使用。使用NULL作为其他表中列的占位符。

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

答案 1 :(得分:0)

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