MYSQL SELECT *不适用于GROUP BY和HAVING

时间:2014-03-14 21:33:25

标签: mysql sql group-by greatest-n-per-group having

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。

为什么第一个查询中缺少记录!?我为什么要选择什么呢?

2 个答案:

答案 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)

它不应该......你在运行第二个查询之前等了一会儿吗?如果是这样,那么就可以创建一堆记录。