显示个别日期,除非它们是连续日期

时间:2014-03-05 02:00:13

标签: php mysql sql date

我正在开发一个显示活动列表的应用程序。最初,该应用程序使用Drupal并将事件显示为“范围”。因此,如果在3/4,3 / 6,3 / 8上有一个事件,它将显示日期为3/4 - 3/8。

我最近将此应用程序移植到自定义解决方案,因为事件变得更加先进。客户刚刚要求此行为令人困惑。他希望它说3 / 4,3 / 6,3 / 8但我们也需要处理连续日期。

因此,如果我们有3/4,3 / 6,3 / 8和3 / 10,3 / 11,3 / 12事件 - 我们需要看到以下内容 3 / 4,3 / 6,3 / 8,3 / 10-3 / 12

目前,活动列表中有一个主事件表

EventID (int)
Event (varchar)
Active (tinyint)

和事件日期表

EventDateID(int)
EventDate
EventTime
EventID

这是我的SQL

SELECT *, MIN(tblEventDates.EventDate) AS minDate
FROM tblEvents INNER JOIN tblEventDates
ON tblEvents.EventID = tblEventDates.EventID
WHERE tblEvents.Active = 1
AND tblEventDates.EventDate >= CURDATE()
GROUP BY tblEvents.EventID
ORDER By minDate, EventTime

我在内部加入这两个表来生成事件列表。在该输出循环期间,我再次查询抓取单个EventDates并生成范围

SELECT MAX(EventDate) AS maxDate, MIN(EventDate) AS minDate
FROM tblEventDates
WHERE EventID = '$EventID'

我只是不确定最佳方法是确定是否要显示范围或隔离日期的这一部分。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不完全理解您为什么不只是在原始查询中获取范围:

SELECT *, MIN(tblEventDates.EventDate) AS minDate, MAX(tblEventDates.EventDate) AS maxDate
FROM tblEvents INNER JOI
     tblEventDates
     ON tblEvents.EventID = tblEventDates.EventID
WHERE tblEvents.Active = 1 AND
      tblEventDates.EventDate >= CURDATE()
GROUP BY tblEvents.EventID
ORDER By minDate, EventTime;

如果您这样做,那么您不需要其他查询来获取maxDate