选择一列上排序前一行符合某些条件的行

时间:2014-05-21 17:40:58

标签: mysql sql select join

我试图计算用户打开我们的电子邮件的频率,但是一周内我们没有打开任何电子邮件。查询看起来像

select * from user_email_tracking uet1 where opened_timestamp is not null and
    select(max(opened_timestamp) from user_email_tracking where user_id = uet1.user_id
    and opened_timestamp < uet1.opened_timestamp

即使我认为嵌套选择,也可能效率太低。这是一张相当大的桌子。我现在正在研究的逻辑可能还不够好,因为我需要基本上处理一个实际的完全笛卡尔连接,在我关心的领域创建的对角线下方。

1 个答案:

答案 0 :(得分:0)

您要查找的是相关子查询,例如:

select *
from user_email_tracking uet
where opened_timestamp is not null and
      not exists (select 1
                  from user_email_tracking uet2
                  where uet2.user_id = uet.user_id and
                        uet2.opened_timestamp >= date_add(uet1.opened_timestamp, interval -7 day)
                 );

为了方便日期算术,我假设timestampdatetime

为获得最佳效果,您需要user_email_tracking(user_id, user_email_tracking)上的索引。