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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql group by,两个条件,限制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日期。我究竟做错了什么?

答案

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

以上是关于mysql group by,两个条件,限制1的主要内容,如果未能解决你的问题,请参考以下文章

MySql学习 —— where / having / group by / order by / limit 简单查询

MySQL对数据表进行分组查询(GROUP BY)

模拟 group by,order by,从 mysql 到 ms sql 2000 的限制

group by 两个字段

mysql:group by,order by

MySql - GROUP BY 和 HAVING关键字