【问题标题】:Select rows from table where two colmns form a distinct set and order by third field从表中选择行,其中两列形成不同的集合并按第三个字段排序
【发布时间】:2014-11-03 23:12:31
【问题描述】:

我有一张名为route_timetables 的表,其中包含公交路线的时间表。

每一行包含一个时间表,用于一个方向(即北、南、东和西)和一种类型的日期(即工作日、周六和周日)。

我需要获取每条路线的最新时间表。所以在路由 id=X 和路由 publish_date 已经过去的地方,我需要获取方向和类型不同的最新时间表。它可能会返回 6 行,其中一行在工作日、周六和周日表示 West,在工作日、周六和周日返回一行。
表格字段如下所示

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

【问题讨论】:

  • 你说the table looks like this,但不包括表格。
  • 有一点值得怀疑的是,您的分组声明中没有包含时间表。在其他 SQL 变体中,这会失败,但我相信 mysql 更宽容 - 虽然看起来仍然是错误的。
  • 对不起,我忘了包括表结构
  • 什么是时间表列类型?

标签: mysql sql select distinct


【解决方案1】:

加入发布日期信息:

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】:

    您可以创建一个单独的表,其中包含一个 id (PK)、时间表和方向。将此新表的 id 作为当前表中的 FK,您可以在此 FK 上调用 DISTINCT()。

    我建议这样做,因为听起来您正在重复时间表和/或方向的值。

    【讨论】:

      【解决方案3】:

      我在这里找到了答案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        相关资源
        最近更新 更多