我想为所有门票选择最早的活动日期。我在mysql中创建了此查询“ tixdate”视图(用于其他目的),并按票证编号对记录进行了排序,然后按eventdate对记录进行了排序。该视图如下所示:

EventDate  | Ticket
2018-02-25 | 998<br>
2018-02-25 | 998<br>
2018-02-25 | 998<br>
2018-02-11 | 998<br>
2018-02-11 | 998<br>
2018-02-04 | 998<br>
2018-02-04 | 998<br>
2018-02-03 | 998<br>
2018-02-03 | 998<br>
2018-01-27 | 998<br>
2018-01-27 | 998<br>
2018-01-21 | 998<br>
2018-01-21 | 998<br>
2018-01-14 | 998<br>
2018-01-14 | 998<br>
2018-01-13 | 998<br>
2018-01-13 | 998<br>
2018-01-07 | 998<br>
-----------------------------------


我创建了一个新的mysql视图,以仅列出最旧的事件日期:

    SELECT
     'audTix` AS `audTix`,
     `audDt` AS `audDt`
    FROM
     `tixdate`
    GROUP BY
     `audTix`
    ORDER BY
     `audDt` DESC


产生了一个记录:

2018-01-13 | 998


但是它应该选择2018-02-25日期。我究竟做错了什么?

最佳答案

无论您从表还是视图中进行选择,数据都被认为是无序的。因此,即使您的视图tixdate包含ORDER BY子句,一旦从其中选择,该子句也会被忽略。 (更精确的说:DBMS可以随意忽略它;它应该这样做是为了更快地选择数据。)

无论如何,即使不是这种情况,您的查询仍然无法使用。您按audTix分组,因此每个audTix会得到一个结果行。但是您选择audDt,它是属于audDtaudTix。您没有说哪个(例如最小值,最大值或平均值),因此MySQL会将其转换为ANY_VALUE(audDt)。然后,按audDt对结果进行排序,但是由于是任意选择的,因此没有任何意义。 (如果表仅包含一个audTix,则只会得到一个结果行,因此显然没有什么可排序的。)

您想要的是最大日期,因此选择它:

SELECT audTix, MAX(audDt)
FROM tixdate
GROUP BY audTix
ORDER BY audTix;


如果要按日期排序,则改为ORDER BY MAX(audDt)。如果您只想要一个具有最新日期的audTix,则需要ORDER BY MAX(audDt) DESC LIMIT 1

而且,如果您只想从所有记录中选择最早的事件日期(而不选择关联的audTix),则

SELECT MAX(audDt) FROM tixdate;


当然。

(并且您可以从视图ORDER BY中删除​​tixdate子句。如上所述,视图中的ORDER BY子句没有任何意义。)

10-08 18:06