【问题标题】:mysql group by, two conditions, limit 1mysql group by,两个条件,限制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 日期。我做错了什么?

【问题讨论】:

    标签: mysql sql view group-by


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2020-12-29
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多