首先会发生什么:选择器中的min()或条件在哪里?

时间:2015-03-19 16:55:42

标签: mysql sql

我创建了以下查询

select
    c.id as eid,
    c.created,
    e.class_id,
    min(e.event_time),
    min(cn.create_time) as lead_date
from
    bm_emails.cid378 c
left join bm_sets.event378 e on e.eid = c.id
left join bm_sets.conversion378 cn on cn.eid = c.id
where e.class_id = 36
group by eid, created, class_id

SQL运行查询时首先会发生什么? where子句或min(e.event_time)

如果where子句在那之后出现那么好。

如果没有,是否有办法扭转此问题,以便首先获取min(e.event_time)获取,然后将where条件应用于该最小日期的子集?

理想情况下不使用子查询。

****以下回复示例:**

如果我在网站上注册并使用class_id 40触发事件,那么一周之后我会来到该网站并使用class_id 36触发事件,那么我不应该包含在结果中。现在看起来我会被包括在内,因为SQL将首先过滤where子句,然后应用最小日期

3 个答案:

答案 0 :(得分:3)

必须首先执行WHERE子句,因为在查询中,MIN会运行查询结果。您需要一个联接或子查询来做您想做的事。

答案 1 :(得分:1)

您可以在条件中使用Min的结果,但是,您需要使用HAVING,而不是WHERE

参考:http://www.mysqltutorial.org/mysql-having.aspx

答案 2 :(得分:1)

WHERE语句首先触发。它限制返回的记录,然后应用MIN。此外,在您的查询中,WHERE e.class_id = 36会使left outer join行为像inner join。如果您要在表中查找MIN值,然后在结果的其余部分中查找,则必须执行子查询。类似的东西:

select
    c.id as eid,
    c.created,
    e.class_id,
    min(e.event_time),
    (SELECT min(cn1.create_time) FROM bm_sets.conversion378 cn1) as lead_date
from
    bm_emails.cid378 c
left join bm_sets.event378 e on e.eid = c.id
left join bm_sets.conversion378 cn on cn.eid = c.id
where e.class_id = 36
group by eid, created, class_id