从表中选择行,其中两列形成不同的集合,并按第三个字段排序

时间:2014-11-03 23:12:31

标签: mysql sql select distinct

我有一个名为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

3 个答案:

答案 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