我通常倾向于使用 JOIN s而不是 EXIST / NOT EXIST 子查询。 下面是一个使用self的方法- LEFT JOIN :
SELECT DISTINCT
user_id
FROM
user_action ua
LEFT JOIN ua2
ON ua2.user_id = ua.userid
AND ua2.type = 'received message'
AND ua2.timestamp > CURRENT_TIMESTAMP() - INTERVAL 2 DAY
WHERE
ua.type = 'opened message'
AND ua.timestamp > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH
AND ua2.user_id IS NULL
细节: 这个 ua1 使用 WHERE 条款 LEFT JOIN ua2 optionnaly尝试在过去两天内查找同一用户的已接收消息 WHERE ... ua2.user_id IS NULL 删除发生此类消息的记录(即 LEFT JOIN (成功) SELECT DISTINCT 当给定用户在上个月内收到多条消息时,避免重复的输出行
1条答案
按热度按时间mklgxw1f1#
我通常倾向于使用
JOIN
s而不是EXIST
/NOT EXIST
子查询。下面是一个使用self的方法-
LEFT JOIN
:细节:
这个
ua1
使用WHERE
条款LEFT JOIN ua2
optionnaly尝试在过去两天内查找同一用户的已接收消息WHERE ... ua2.user_id IS NULL
删除发生此类消息的记录(即LEFT JOIN
(成功)SELECT DISTINCT
当给定用户在上个月内收到多条消息时,避免重复的输出行