在SQL查询中加入+日期条件

时间:2015-09-14 14:24:33

标签: mysql sql join left-join

我在数据库中有两个表:事件日期,它们之间存在一对多的关系( 1事件可以在许多表中发生日期)。

我想查询数据库以获取此类未来和过去的事件:

  • 查询以获取未来事件应返回每个日期> = CURDATE()的事件以及尚未指定日期的事件 ...
  • 查询以获取过去的事件应该只返回至少分配了一个日期的事件,而这些事件应该比CURDATE()早...

我使用简单的连接查询数据库,在过去的事件中获得适当的结果(限制不返回没有日期的事件)。但是,对未来事件的查询有点棘手,因为还必须返回没有日期的事件。我对任何建议持开放态度。

到目前为止我的尝试:

过去的事件(工作正常):

SELECT dates.*, events.*,
FROM events
JOIN dates on (events.eventID = dates.eventID AND dates.date < CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

对于未来的事件: ???

SELECT dates.*, events.*,
FROM events
LEFT JOIN dates on (events.eventID = dates.eventID AND dates.date >= CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

(我知道我的 LEFT JOIN 尝试无效,因为它也返回过去的事件,没有日期信息(每个字段为NULL))。

提前致谢。

3 个答案:

答案 0 :(得分:1)

首先,当您放置它们时,您的查询不需要GROUP BY子句,因为没有进行聚合(没有countmax等)。

你必须分开“加入逻辑”和“条件逻辑”,所以我建议:

过去的事件:

SELECT dates.*, events.*
FROM events
JOIN dates on (events.eventID = dates.eventID)
WHERE dates.date < CURDATE()
ORDER BY events.eventID ASC

未来事件:

SELECT dates.*, events.*
FROM events
LEFT JOIN dates on events.eventID = dates.eventID
WHERE dates.date >= CURDATE()) OR dates.date IS NULL
ORDER BY events.eventID ASC

答案 1 :(得分:0)

如果事件表中的记录始终在日期表中有记录,则可以使用

SELECT dates.*, events.*,
FROM events
JOIN dates on (events.eventID = dates.eventID AND NVL(dates.date, CURDATE()) >= CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

我想我不会理会为什么过去的事件也没有日期。

答案 2 :(得分:0)

我甚至没有查看“过去事件”的查询,因为你说它没问题。

对于未来的事件,尝试这样的事情:

SELECT 
    `events` . *, `dates` . *, MAX(`dates`.`date`) as `maxDate`
FROM
    `events` AS `events`
        LEFT JOIN
    `dates` AS `dates` ON (`events`.`eventID` = `dates`.`eventID`)
GROUP BY `events`.`eventID`
HAVING `maxDate` >= CURDATE()
    OR `dates`.`date` IS NULL
ORDER BY events.eventID ASC;