gpt4 book ai didi

mysql - GROUP BY HAVING 没有按预期工作

转载 作者:行者123 更新时间:2023-11-29 05:28:27 25 4
gpt4 key购买 nike

我正在为应该是一个简单的查询而苦苦挣扎。

事件表存储应用程序中的用户事件。每次点击都会生成一个新的事件和日期时间戳。我需要显示具有最新日期时间戳的最近访问记录的列表。我只需要显示过去 7 天的事件。

该表有一个自增字段(eventID),它对应于date_event字段,所以最好用它来确定组中的最新记录。

我发现有些记录没有出现在我的结果中,并且符合预期的最新日期时间。所以我从基础上剥离了我的查询:

请注意,现实生活中的查询不会查看 custID。我将其包含在这里是为了缩小问题的范围。

        SELECT
el.eventID,
el.custID,
el.date_event
FROM
event_log el
WHERE
el.custID = 12345 AND
el.userID=987
GROUP BY
el.custID
HAVING
MAX( el.eventID )

这是返回:

eventID     custID  date_event
346290 12345 2013-06-21 09:58:44

这是解释

id  select_type     table   type    possible_keys               key     key_len     ref     rows    Extra
1 SIMPLE el ref userID,custID,Composite custID 5 const 203 Using where

如果我将查询更改为使用 HAVING MIN,结果不会改变。我应该看到不同的 eventID 和 date_event,因为有许多记录匹配 custID 和 userID。

        SELECT
el.eventID,
el.custID,
el.date_event
FROM
event_log el
WHERE
el.custID = 12345 AND
el.userID=987
GROUP BY
el.custID
HAVING
MIN( el.eventID )

与之前相同的结果:

eventID     custID  date_event
346290 12345 2013-06-21 09:58:44

没有变化。

这告诉我我还有另一个问题,但我没有看到那可能是什么。

一些指点将不胜感激。

最佳答案

SELECT
el.eventID,
el.custID,
el.date_event
FROM
event_log el
WHERE
el.custID = 12345 AND
el.userID=987 AND
el.eventID IN (SELECT MAX(eventID)
FROM event_log
WHERE custID = 12345
AND userID = 987)

您的查询不起作用,因为您误解了 HAVING 的作用。它计算结果集每一行的表达式,并保留表达式计算结果为真的行。表达式 MAX(el.eventID) 仅返回查询选择的最大事件 ID,它不会将当前行与该事件 ID 进行比较。

另一种方式是:

SELECT
el.eventID,
el.custID,
el.date_event
FROM
event_log el
WHERE
el.custID = 12345 AND
el.userID=987
ORDER BY eventID DESC
LIMIT 1

适用于多个 custID 的更通用的形式是:

SELECT el.*
FROM event_log el
JOIN (SELECT custID, max(date_event) maxdate
FROM event_log
WHERE userID = 987
GROUP BY custID) emax
ON el.custID = emax.custID AND el.date_event = emax.maxdate
WHERE el.userID = 987

关于mysql - GROUP BY HAVING 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17373275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com