【发布时间】:2013-04-02 18:11:37
【问题描述】:
每个时间表都有许多坡道,每个坡道都有一个end_date。
我需要列出我的所有坡道,以及一个包含坡道 ID 的额外字段以及该时间表的最新结束日期。我还需要能够在我的WHERE 子句中使用这个额外的字段。
这通常是使用MAX 函数的子查询的情况,除了一个问题:斜坡的end_date 字段可以为空,表示斜坡是当前的。因此,SELECT MAX(end_date) 不起作用,因为 null 值比非空值“小”。
到目前为止,这是我想出的:
SELECT r1.*,
(SELECT r2.id
FROM ramp as r2
WHERE schedule_id = r.schedule_id
ORDER BY IF(end_dte is NULL, '9999-99-99', end_dte) DESC
LIMIT 1) as latestId
FROM ramp as r1
这会产生这张表,这正是我想要的:
+-------+-------------+------------+-----------------+--------+------------+------------+----------+
| id | schedule_id | suppr_flag | comment | months | start_dte | end_dte | latestId |
+-------+-------------+------------+-----------------+--------+------------+------------+----------+
| 16 | 7 | NULL | NULL | NULL | 2008-06-23 | NULL | 16 |
| 15 | 6 | NULL | NULL | NULL | 2007-05-01 | 2007-12-31 | 15 |
| 13 | 5 | NULL | 1-15 deals | NULL | 2004-08-11 | NULL | 13 |
| 11 | 4 | NULL | NULL | NULL | 2005-08-11 | NULL | 11 |
| 12 | 4 | NULL | NULL | 12 | 2004-08-11 | 2005-08-10 | 11 |
| 17 | 13 | NULL | NULL | 6 | 2009-03-05 | 2009-09-04 | 19 |
| 18 | 13 | NULL | NULL | 6 | 2009-09-05 | 2010-03-04 | 19 |
| 19 | 13 | NULL | NULL | NULL | 2010-03-05 | NULL | 19 |
| 20 | 14 | NULL | NULL | 12 | 2001-06-18 | 2008-06-17 | 20 |
除非我不能在 WHERE 子句中使用 latestId(它是未知列)。
你有什么想法吗?
【问题讨论】: