我在数据库中有两个表:事件和日期,它们之间存在一对多的关系( 1事件可以在许多表中发生日期)。
我想查询数据库以获取此类未来和过去的事件:
我使用简单的连接查询数据库,在过去的事件中获得适当的结果(限制不返回没有日期的事件)。但是,对未来事件的查询有点棘手,因为还必须返回没有日期的事件。我对任何建议持开放态度。
到目前为止我的尝试:
过去的事件(工作正常):
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))。
提前致谢。
答案 0 :(得分:1)
首先,当您放置它们时,您的查询不需要GROUP BY
子句,因为没有进行聚合(没有count
,max
等)。
你必须分开“加入逻辑”和“条件逻辑”,所以我建议:
过去的事件:
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;