我有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数据)
为什么我的查询错了?
答案 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
答案 1 :(得分:0)
建议: 您将需要单独使用每个表运行它并使用union来附加数据。 在加入Altas时保持列值(来自bajas的列)为Null,反之亦然。