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

问题描述 投票:0回答:1

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

mysql sql view group-by
1个回答
1
投票

无论您是从表格还是视图中进行选择,数据都被视为无序数据。因此,即使您的视图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子句毫无意义。)

© www.soinside.com 2019 - 2024. All rights reserved.