我想为所有门票选择最早的活动日期。我在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
,它是属于audDt
的audTix
。您没有说哪个(例如最小值,最大值或平均值),因此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
子句没有任何意义。)