子查询或加入哪个是最优解?

时间:2011-03-02 12:47:17

标签: mysql join subquery

我有2张桌子,1张用户桌子和一张桌子 外发电子邮件排队。我想选择用户
在一段时间内不在线的人 并发送电子邮件给他们。我也想要,如果他们是 在过去7天内收到了这样的电子邮件 或者在接下来的7天内收到预定的电子邮件, 他们没有被选中。

我有2个查询,我认为如果是这样的话会很好 他们正在使用子查询。

作为一个我不是专家的领域,我会 喜欢邀请你参加,

  1. 构建第二个查询的子查询
  2. 联接并排除第二个查询结果。
  3. 我会更开心:)

    感谢您阅读

    SELECT
        `user_id`
    FROM
        `user`
    WHERE
        DATEDIFF( CURRENT_DATE(), date_seen ) >= 7 
    

    应排除第二个查询的结果 来自上面的查询。

    SELECT 
        `mail_queue_id`,
        `mail_id`,
        `user_id`,
        `status`,
        `date_scheduled`,
        `date_processed`
    FROM
        `mail_queue`
    WHERE
        ( 
            DATEDIFF( CURRENT_DATE(), date_scheduled ) >= 7 
                OR
            DATEDIFF( date_scheduled, CURRENT_DATE() ) <= 7
        )
        AND
        (
    
            `mail_id` = 'inactive_week'
    
            AND
            (
                `status` = 'AWAITING'
                OR
                `status` = 'DELIVERED'
            )
    
        )
    

    SELECT
        `user_id`
    FROM
        `user` as T1
    WHERE
        DATEDIFF( CURRENT_DATE(), date_seen ) >= 7 
        AND NOT EXISTS
        (
    
            SELECT 
                `user_id`    
            FROM
                `mail_queue` as T2
            WHERE
                T2.`user_id` = T1.`user_id`
                AND
                (
    
                    DATEDIFF( CURRENT_DATE(), date_scheduled ) >= 7 
                        OR
                    DATEDIFF( date_scheduled, CURRENT_DATE() ) <= 7
    
                    AND
                    (
    
                        `mail_id` = 'inactive_week'
    
                        AND
                        (
                            `status` = 'AWAITING'
                            OR
                            `status` = 'DELIVERED'
                        )
    
    
                    )
    
    
    
                )
    
    
        )
    

1 个答案:

答案 0 :(得分:1)

你可以选择符合第一个标准的用户(过去七天没有登录),然后使用“NOT EXISTS”将该标准“和”到另一个子句,对同一个表别名:

        select * from T where {first criterion}
        and not exists
        (
          select  * from T as T2 where T2.userid = T.userid
          and ABS( DATEDIFF(datescheduled, CURRENT_DATE()) ) <=7

       )

我不熟悉mysql DATEDIFF的细微差别,即是否重要哪个日期值出现在哪个位置,但绝对值会使得如果用户在过去7天内收到通知或者计划在接下来的七天内收到通知,他们会满足条件,从而使NOT EXISTS条件失败,不包括最后一组用户。