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