不幸的是,MySQL 缺少 FULL OUTER JOIN,因此您必须将 UNION 两组放在一起。
这将为您提供Type1Km 存在的情况,无论Type2Km 是否存在。
SELECT
t1.`Time` as StartTime,
t1.`Kilometers` as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t1
LEFT JOIN `times` t2 ON t2.`Type` = 2
AND t2.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` > t1.`Time`
ORDER BY `Time` LIMIT 1)
WHERE t1.`Type` = 1
现在我们需要Type1Km 不存在的情况。
SELECT
t2.`Time` as StartTime,
NULL as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t2
LEFT JOIN `times` t1 ON t1.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` < t2.`Time`
ORDER BY `Time` DESC LIMIT 1)
WHERE t2.`Type` = 2
AND (t1.`Type` = 2 OR t1.`Type` IS NULL)
UNION 将它们放在一起,你就会得到想要的结果:
(
SELECT
t1.`Time` as StartTime,
t1.`Kilometers` as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t1
LEFT JOIN `times` t2 ON t2.`Type` = 2
AND t2.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` > t1.`Time`
ORDER BY `Time` LIMIT 1)
WHERE t1.`Type` = 1
) UNION ALL (
SELECT
t2.`Time` as StartTime,
NULL as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t2
LEFT JOIN `times` t1 ON t1.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` < t2.`Time`
ORDER BY `Time` DESC LIMIT 1)
WHERE t2.`Type` = 2
AND (t1.`Type` = 2 OR t1.`Type` IS NULL)
)
ORDER BY `StartTime`
更新
在我之前的查询中,我忘记在一开始就有“类型 2”记录。更新以说明这一点。这是我得到的结果:
times 表中的数据:
+----------+------+------------+
| Time | Type | Kilometers |
+----------+------+------------+
| 11:00:00 | 2 | 0.1 |
| 12:00:00 | 1 | 0.1 |
| 12:30:00 | 2 | 0.2 |
| 14:00:00 | 1 | 0.4 |
| 14:30:00 | 1 | 0.8 |
| 15:00:00 | 2 | 1.0 |
| 15:30:00 | 2 | 0.2 |
| 16:00:00 | 1 | 1.2 |
| 16:30:00 | 2 | 1.5 |
| 16:45:00 | 1 | 2.0 |
+----------+------+------------+
查询结果:
+-----------+---------+---------+
| StartTime | Type1Km | Type2Km |
+-----------+---------+---------+
| 11:00:00 | NULL | 0.1 |
| 12:00:00 | 0.1 | 0.2 |
| 14:00:00 | 0.4 | NULL |
| 14:30:00 | 0.8 | 1.0 |
| 15:30:00 | NULL | 0.2 |
| 16:00:00 | 1.2 | 1.5 |
| 16:45:00 | 2.0 | NULL |
+-----------+---------+---------+