3

我尝试做一个简单的查询,花了几个小时的音调却什么也没得到……
我所需要的只是获取 MAX 日期,所有都是相应的字段。

我解释一下:我有一个包含以下字段的表:BasketID, OrderStatusTypeID, StatusDate
我尝试只获取一个包含OrderStatusTypeID最后一个值的记录StatusDate

这是数据

BasketID    OrderStatusTypeID   date
1111        13              2013-04-01 11:38:31
1111        26              2013-04-04 17:44:17
1111        39              2013-04-02 12:35:07
1111        40              2013-04-08 12:52:55

这是我的查询:

SELECT BasketID, OrderStatusTypeID, max(StatusDate) date
FROM st
where BasketID=1111
group by BasketID

这是我需要的结果

BasketID    OrderStatusTypeID   date
63558       40          2013-04-08 12:52:55

出于某种原因,我只得到OrderStatusTypeID = 13而不是40!(StatusDate 的最大值,而不是 OrderStatusTypeID 的最大值)。
为什么???

BasketID    OrderStatusTypeID   date
63558       13                   2013-04-08 12:52:55

感谢您的快速响应!

4

3 回答 3

5

我假设您正在使用MySQL,因为即使您没有在GROUP BY子句中指定所有非聚合列,您也可以运行查询。

有很多方法可以解决这个问题,但我习惯这样做。该查询使用一个子查询,它分别date为每个BasketID. 由于子查询仅返回两列,因此您需要将其连接回表本身以获取其他列,前提是它在两列上匹配:BasketID, Date.

SELECT  a.*
FROM    st a
        INNER JOIN
        (
            SELECT  BasketID, MAX(Date) max_date
            FROM    st
            GROUP   BY BasketID
        ) b ON  a.BasketID = b.BasketID AND
                a.Date = b.max_date

您的查询已成功执行而未引发异常,即使GROUP BY子句中未指定非聚合列,因为它在 MySQL 中是允许的。请参阅GROUP BY 的 MySQL 扩展

于 2013-04-09T13:14:47.150 回答
0

我知道这是一个旧线程,但是为什么在这种情况下不能使用 ORDER BY 和 LIMIT 呢?像这样的查询:

SELECT * FROM st WHERE BasketID=1111 ORDER BY Date DESC LIMIT 1

于 2014-05-28T08:01:19.527 回答
0

它非常容易使用 TOP 命令,例如:

SELECT TOP 1 * FROM st 
WHERE BasketID = 1111
ORDER BY date DESC
于 2017-04-18T08:08:29.947 回答