作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为应该是一个简单的查询而苦苦挣扎。
事件表存储应用程序中的用户事件。每次点击都会生成一个新的事件和日期时间戳。我需要显示具有最新日期时间戳的最近访问记录的列表。我只需要显示过去 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/
我是一名优秀的程序员,十分优秀!