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

Posted

技术标签:

【中文标题】mysql group by,两个条件,限制1【英文标题】:mysql group by, two conditions, limit 1 【发布时间】:2018-03-04 16:58:22 【问题描述】:

我想为所有门票选择最早的活动日期。我在 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】:

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

无论如何,即使不是这种情况,您的查询仍然无法正常工作。您按audTix 分组,因此每个audTix 得到一个结果行。但是您选择audDt,它是属于audTixaudDt。你没有说哪个(例如最小值、最大值或平均值),所以 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;

当然。

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

【讨论】:

非常感谢!使用 MAX() 函数效果很好。我不知道 db ignores 会忽略 order by。

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

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

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

mysql:group by,order by

MySQL:条件 MIN() 与 GROUP BY

MySQL 条件 SUM 使用 GROUP BY 和 DISTINCT

关于group by 两个或以上条件的分析