查询:选择第一个(按日期排序)子对象的日期在日期范围内的所有位置

时间:2017-08-10 08:27:30

标签: php mysql date parent-child date-range

我有一个父对象,让我们说一个事件。

此事件可能发生在几个日期,因此我们有EventDates。

现在我希望活动的开始日期在日期范围内(例如学年)。

通常这很容易,但由于开始日期不是Event的直接属性,我们需要加入EventDates。

我已经尝试过以下(非正统)方法,这种方法似乎已经工作了一段时间,但突然之间不再有了:

SELECT *, min(ed_date) AS ed_date FROM events
LEFT JOIN event_dates ON events.e_id = event_dates.ed_event_id
WHERE ed_date >= '2016-09-01'
AND ed_date <= '2017-08-31'

显然,如果在上述范围内有一个EventDate,它将取该范围内的第一个作为&#34; min(ed_date)&#34;而不是实际的最短日期。

如果已经有解决方案,我必须错过它。 任何帮助表示赞赏。我不想使用php来查找所有单独的日期,并使用这些ID来对这些结果应用IN数组过滤器。

单独保存事件本身的开始日期也可能是一种选择,但我不喜欢冗余数据。

如果您有疑问或某些事情不清楚,请务必提问。

更新。 对于一些样本数据存在疑问,希望我能做到这一点:

table events:
e_id:int(11) e_category_id:int(11) e_title:varchar(255) e_status:int(11)

table event_dates:
ed_id:int(11) ed_event_id:int(11) ed_title:varchar(255) ed_date:date

让我们说有2个事件:E1&amp; E2。 (标题,类别和状态与此案例并不相关)
3个event_dates链接到每个事件 E1的日期:2017/05/05 - 05/05/2017 - 08/05/2017 E2的日期:2017/04/28 - 02/05/2017 - 04/05/2017

现在我希望所有活动的开始日期(分别为2017年5月3日和2017年4月28日)都在01/05 / 2017-31 / 05/2017的日期范围内。

如果我执行以下操作:

SELECT *, min(ed_date) as ed_date FROM events
LEFT JOIN event_dates ON event_dates.ed_event_id = events.e_id
WHERE ed_date >= '2017-05-01'
AND ed_date <= '2017-05-31'
GROUP BY events.e_id

(GROUP BY并未包含在上面的第一个选项中,道歉。)

然后我得到了两个事件,第二个事件的ed_date是02/05/2017。

它得到了该范围内的日期的最小值(ed_date)(03/05/2017和02/05/2017),而不是实际的最小值(ed_date)(03/05/2017&amp; 28) / 04/2017)。

这样清楚吗?

0 个答案:

没有答案