SELECT * FROM or_mail
GROUP BY campaign_id
HAVING date_time = MAX(date_time);
SELECT campaign_id, date_time FROM or_mail
GROUP BY campaign_id
HAVING date_time = MAX(date_time);
第一个查询返回13条记录。第二个回归35。
为什么第一个查询中缺少记录!?我为什么要选择什么呢?
答案 0 :(得分:2)
这是您的查询:
SELECT campaign_id, date_time
FROM or_mail
GROUP BY campaign_id
HAVING date_time = MAX(date_time);
您按campaign_id
进行汇总。这意味着每campaign_id
个结果将有一行。 date_time
排在哪一行?好吧,来自其中一个匹配行的任意值。只有一个值,一个任意值。 having
子句也是如此。换句话说,查询没有按照您的预期执行。
无论您是否知道,您使用的是group by
特定于MySQL的扩展名(您可以阅读文档here)。文档特别警告不要使用这个说法。 (如果date_time
在具有相同campaign_id
的所有行上相同,则没有问题,但情况并非如此。)
以下是您真正想要的查询:
SELECT campaign_id, date_time
FROM or_mail om
WHERE not exists (select 1
from or_mail om2
where om2.campaign_id = om.campaign_id and
om2.date_time > date_time
);
这说的是:返回or_mail
中所有行的结果,其中的属性是date_time
没有相同的campaign_id
。
HAVING date_time = MAX(date_time);
答案 1 :(得分:0)
它不应该......你在运行第二个查询之前等了一会儿吗?如果是这样,那么就可以创建一堆记录。