好吧,我没有找到这个问题的正确标题,抱歉。
我有一张桌子,用于存储发送给用户的一些电子邮件。
在此表中,我可以知道用户是否阅读了电子邮件。
表格结构:
[MAILSEND_ID] (INT),
[ID_USER] (INT),
[MAIL_ID] (INT),
[READ] (BIT)
数据:
;WITH cte AS (
SELECT * FROM (VALUES
(1, 10256, 10, 0),
(1, 10257, 10, 1),
(1, 10258, 10, 1),
(1, 10259, 10, 0),
(2, 10256, 10, 0),
(2, 10257, 10, 0),
(2, 10258, 10, 1),
(2, 10259, 10, 0),
(3, 10256, 10, 1),
(3, 10257, 10, 0),
(3, 10258, 10, 0),
(3, 10259, 10, 0)
) as t(MAILSEND_ID, ID_USER, MAIL_ID, READ)
在此示例中,您可以看到,我有4个用户和3个已发送的电子邮件。
User 10256
1st Email - Don't Read
2nd Email - Don't Read
3rd Email - Read
我需要在此表上进行选择,我给出[MAIL_ID]
和[NUMBER]
,此数字代表用户未读取的连续电子邮件。
使用最后一个例子:
提供
[NUMBER] = 3, [MAIL_ID] = 10
仅返回
USER_ID 10259
。提供
[NUMBER] = 2, [MAIL_ID] = 10
返回
USER_ID 10257, 20259.
提供
[NUMBER] = 1, [MAIL_ID] = 10
返回
USER_ID 10257, 10258, 20259.
换句话说,USER_ID
可以有一个累计数量的电子邮件未读取,但如果该用户阅读了最后一封电子邮件,则无法在查询中返回。
这是我今天的查询,但只返回未读取的电子邮件总数:
select * from (
select
a.[USER_ID],
COUNT(a.[USER_ID]) as tt
from
emailmkt.mailing_history a
where
a.[MAIL_ID] = 58 and
a.[READ]=0
group by
[USER_ID]
) aa where tt > [NUMBER]
所以逻辑不对。我想将此逻辑转移到SQL,如果可能的话,不要在Code上执行此操作。
对不起,如果有任何英语错误。
提前致谢。
答案 0 :(得分:2)
使用以下查询,您可以根据mailsend_id与时间相关的假设获取用户要读取的邮件的滚动计数(我将READ更改为IsRead'因为我没有char `在我的键盘上)
SELECT ID_USER, Mail_ID
, groupid CURRENT
, @roll := CASE WHEN coalesce(@groupid, '') = groupid
THEN @roll + 1
ELSE 1
END AS roll
, @groupid := groupid OLD
FROM (SELECT mh.ID_USER, mh.Mail_ID
, concat(mh.id_user, mh.mail_id) groupid
FROM mailing_history mh
INNER JOIN (SELECT id_user
, max(CASE isread
WHEN 1 THEN MAILSEND_ID
ELSE 0
END) lastRead
FROM mailing_history
GROUP BY id_user) lr
ON mh.id_user = lr.id_user AND mh.MAILSEND_ID > lr.lastread
ORDER BY id_user, MAILSEND_ID) a
演示:SQLFiddle
列Roll具有要为用户阅读的邮件的滚动计数 添加一个级别,您可以在WHERE条件中检查Roll对NUMBER的值,并在group_concat中检查user_id