我创建了以下查询
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子句,然后应用最小日期
答案 0 :(得分:3)
必须首先执行WHERE子句,因为在查询中,MIN会运行查询结果。您需要一个联接或子查询来做您想做的事。
答案 1 :(得分:1)
您可以在条件中使用Min的结果,但是,您需要使用HAVING
,而不是WHERE
。
答案 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