我有一个名为route_timetables
的表,其中包含公交路线的时间表。
每行包含一个方向的一个时间表(即北,南,东和西)和一种类型的日(即工作日,星期六和星期日)。
我需要获得每条路线的最新时间表。因此,当路由id = X并且路径publish_date已经过去时,我需要获得最新的时间表,其中方向和类型是不同的。它可能会在工作日,周六和周日返回6行,一个用于西方,一个用于工作日,周六和周日用于东方。 表格字段如下所示
id route_id timetable publish_date direction type
我尝试了几种不同的方法。我认为这段代码正在运行,但它正在查询一个旧的时间表,也是平日,向西行进。
SELECT timetable, direction, type, MAX(publish_date)
FROM route_timetables
WHERE publish_date<=curDate() and route_id=2
GROUP BY direction, type
答案 0 :(得分:0)
您可以创建一个单独的表,其中包含id(PK),时间表和方向。将此新表的ID作为当前表中的FK,您可以在此FK上调用DISTINCT()。
我建议这样做,因为听起来你有重复的时间表和/或方向值。
答案 1 :(得分:0)
加入发布日期信息:
SELECT rt.*
FROM route_timetables rt JOIN
(SELECT direction, type, route_id, MAX(publish_date) as maxpd
FROM route_timetables
WHERE publish_date <= curDate() and route_id = 2
GROUP BY direction, type, route_id
) dtr
ON dtr.route_id = rt.route_id and dtr.type = dt.type and dtr.direction = dtr.direction and
dtr.maxpd = tr.publish_date ;
这是正确的想法。如果没有样本数据,很难判断正确的字段是否用于聚合和on
子句。
答案 2 :(得分:0)
我在How to group by 2 fields and order by date at the same time?找到了答案并重新定位了它。
SELECT
rt.*
FROM
route_timetables rt
JOIN
( SELECT
direction
, type
, MAX(publish_date) AS latest_date_registered
FROM
route_timetables
WHERE publish_date<=curDate()
GROUP BY
direction
, type
) AS grp
ON grp.direction = rt.direction
AND grp.type = rt.type
AND grp.latest_date_registered = rt.publish_date
Where route_id=2