我正在使用mysql。
我有一个带有userid,message_id,open(true或false),timestamp的消息表。
我希望所有未收到过最近5封邮件的用户
这就是我现在所拥有的:
SELECT mnc.userid
FROM `messages` mnc
WHERE (select count(*) from messagesas m where m.userid = mnc.userid
and m.message_sendtime_timestamp >= mnc.message_sendtime_timestamp
and m.opened = 'FALSE') >= 6
但是,这为用户提供了超过6条未打开的消息 不一定是连续的
以下是示例数据
CREATE TABLE messages
(`user_id` int, `timestamp` datetime, `opened` varchar(5))
;
INSERT INTO messages
(`user_id`, `timestamp`, `opened`)
VALUES
(1, '2016-01-01 00:00:00', 'false'),
(1, '2016-02-01 00:00:00', 'false'),
(1, '2016-03-01 00:00:00', 'false'),
(1, '2016-04-01 00:00:00', 'false'),
(1, '2016-05-01 00:00:00', 'false'),
(1, '2016-06-01 00:00:00', 'false'),
(2, '2016-01-01 00:00:00', 'false'),
(2, '2016-02-01 00:00:00', 'false'),
(2, '2016-03-01 00:00:00', 'false'),
(3, '2015-01-01 00:00:00', 'false'),
(3, '2016-01-01 00:00:00', 'false'),
(3, '2016-02-01 00:00:00', 'false'),
(3, '2016-03-01 00:00:00', 'false'),
(3, '2016-04-01 00:00:00', 'false'),
(3, '2016-05-01 00:00:00', 'true'),
(3, '2016-06-01 00:00:00', 'false'),
(4, '2015-01-01 00:00:00', 'true'),
(4, '2015-02-01 00:00:00', 'true'),
(4, '2016-01-01 00:00:00', 'false'),
(4, '2016-02-01 00:00:00', 'false'),
(4, '2016-03-01 00:00:00', 'false'),
(4, '2016-04-01 00:00:00', 'false'),
(4, '2016-05-01 00:00:00', 'false'),
(4, '2016-06-01 00:00:00', 'false')
预期结果:
userid
1
4
答案 0 :(得分:0)
Mon Mar 21 20:05:00 2016
cpu
us sy wt id
4 2 0 94
...
...
...
Mon Mar 21 20:10:00 2016
cpu
us sy wt id
3 2 0 94
...
...
...
答案 1 :(得分:0)
回答这个问题
我希望收到最近5封邮件中没有打开邮件的所有用户?
首先,您需要为每个row_id
user_id
SELECT @rowid := IF(@prev_value = user_id, @rowid + 1, 1) as row_id,
m.*
@prev_value := user_id
FROM messages m,
(SELECT @row_num := 1) x,
(SELECT @prev_value := '') y
ORDER BY `timestamp` DESC
然后检查您在该子查询上打开的消息数量
<强> SQL Fiddle Demo 强>
SELECT user_id, COUNT(*), SUM(opened = 'false')
FROM (
SELECT @rowid := IF(@prev_value = user_id, @rowid + 1, 1) as row_id,
m.*,
@prev_value := user_id
FROM messages m,
(SELECT @row_num := 1) x,
(SELECT @prev_value := '') y
ORDER BY user_id, `timestamp` DESC
) T
WHERE row_id <= 5 -- only check last 5 or less messages
GROUP BY user_id
HAVING COUNT(*) = SUM(opened = 'false') -- Check all messages are NOT opened