mysql group by,两个条件,限制1

时间:2018-03-04 16:58:23

标签: mysql sql view group-by

我想为所有门票选择最早的活动日期。我在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日期。我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

任何方式,即使不是这种情况,那么您的查询仍然无法正常工作。您按audTix进行分组,因此每个audTix获得一个结果行。但是,您选择属于​​audDt的{​​{1}} audDt。您不会说出哪个(例如最小值,最大值或平均值),因此MySQL会将其转换为audTix。然后,您按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子句毫无意义。)