SQL - 从表中选择布尔结果

时间:2014-04-14 15:11:54

标签: mysql sql sql-server sql-server-2008 tsql

好吧,我没有找到这个问题的正确标题,抱歉。

我有一张桌子,用于存储发送给用户的一些电子邮件。

在此表中,我可以知道用户是否阅读了电子邮件。

表格结构:

[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上执行此操作。

对不起,如果有任何英语错误。

提前致谢。

1 个答案:

答案 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