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
,它是属于audTix
的audDt
。你没有说哪个(例如最小值、最大值或平均值),所以 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学习 —— where / having / group by / order by / limit 简单查询