![](/img/trans.png)
[英]Request to select the last 10 send/received messages to/by different users
[英]MySQL : SELECT all users with 5 unopened messages in there last 5 messages received in a messages table
我正在使用mysql。
我有一個帶有用戶ID,message_id,打開(真或假),時間戳的消息表。
我希望所有未在其中打開消息的用戶收到最近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
SELECT
MAX(CASE WHEN (t.ct = 5 and t.op=5) THEN t.user_id END) AS userid
FROM
(
SELECT
user_id,
opened,timestamp ,
@opened := opened,
IF ( (@opened = 'false' && @prev = user_id) ,@o := @o + 1,@o := 1),
IF(@opened='true',@o:=0,@o) op,
IF (@prev = user_id ,@c := @c + 1,(@c := 1)) ct,
@prev := user_id
FROM (SELECT @prev := 0 ,@c := 1,@opened :='0',@o := 0) var,
messages
order by user_id asc,timestamp desc
) t
GROUP BY t.user_id
回答這個問題
我是否希望在收到的最后5條消息中所有未打開消息的用戶?
首先,您需要為每個user_id
創建一個row_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
然后檢查該子查詢上有多少打開的消息
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.