mysql - 子查询和Join哪个是最优解?

标签 mysql join subquery

我有 2 个表,1 个用户表和一个表,其中
外发电子邮件已排队。我想选择用户
在一定时间内不在线
并向他们发送电子邮件。我也想要,如果他们
过去 7 天内已收到此类电子邮件
或者有一封预定的 future 7 天的电子邮件,
他们没有被选中。

我有 2 个疑问,我认为如果
他们正在使用子查询。

作为一个我不是专家的领域,我会
诚邀您参加,

  1. 构建第二个查询的子查询
  2. 进行 JOIN 并排除第二个查询结果。

我会更加高兴:)

感谢您的阅读

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'
                    )


                )



            )


    )

最佳答案

您可以选择符合第一个条件的用户(过去 7 天内未登录),然后使用“NOT EXISTS”将该条件“AND”到另一个子句,为同一个表设置别名:

        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 天内收到通知或计划在接下来的 7 天内收到通知,他们将满足条件,从而不符合 NOT EXISTS 条件,从而将该用户从您的最终集合中排除。

关于mysql - 子查询和Join哪个是最优解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5167677/

相关文章:

MySQL 对 2 个表的内部/外部连接进行更新

php - 在 mysql/php 中连接两个查询

mysql - 使用引用字段别名的子选择,MySQL 语句的 SQLite 中的等效项是什么

mysql - 左连接与子选择 - 右表列不显示

mysql - MySQL 中的错误 "Every derived table must have its own alias"是什么?

mysql - 如何设置SQL查找上周日到本周日的记录(1周)

mysql - 使用 Helm 安装的 Kafka/Confluent 的连接器

mysql 字符串比较 - md5 更快?

WordPress 帖子页面上的 MYSQL SQL 语法错误

php - 从多个表中获取图像