为了得到第N(在这里2)信息时,请
SELECT
user_id
, message_id
FROM (
SELECT
user_id
, message_id
, id
, (CASE WHEN @user_id != user_id THEN @rank := 1 ELSE @rank := @rank + 1 END) AS rank,
(CASE WHEN @user_id != user_id THEN @user_id := user_id ELSE @user_id END) AS _
FROM (SELECT * FROM MessageSent ORDER BY user_id, id) T
JOIN (SELECT @cnt := 0) c
JOIN (SELECT @user_id := 0) u
) R
WHERE rank < 3
ORDER BY user_id, id
;
它采用了RANK替代品,从@Seaux response衍生的MySQL是否有Oracle的“解析函数相当于”?
将其扩展到你原来的问题,只需添加相应的计算:
SELECT
COUNT(DISTINCT MO.user_id) * 100/
(SELECT COUNT(DISTINCT user_id)
FROM (
SELECT
user_id
, message_id
, id
, (CASE WHEN @user_id != user_id THEN @rank := 1 ELSE @rank := @rank + 1 END) AS rank,
(CASE WHEN @user_id != user_id THEN @user_id := user_id ELSE @user_id END) AS _
FROM (SELECT * FROM MessageSent ORDER BY user_id, id) T
JOIN (SELECT @cnt := 0) c
JOIN (SELECT @user_id := 0) u
) R2
WHERE rank < 3
) AS percentage_who_read_one_of_the_first_messages
FROM MessageOpened MO
JOIN
(SELECT
user_id
, message_id
FROM (
SELECT
user_id
, message_id
, id
, (CASE WHEN @user_id != user_id THEN @rank := 1 ELSE @rank := @rank + 1 END) AS rank,
(CASE WHEN @user_id != user_id THEN @user_id := user_id ELSE @user_id END) AS _
FROM (SELECT * FROM MessageSent ORDER BY user_id, id) T
JOIN (SELECT @cnt := 0) c
JOIN (SELECT @user_id := 0) u
) R
WHERE rank < 3) MR
ON MO.user_id = MR.user_id
AND MO.message_id = MR.message_id
;
随着MySQL的无热膨胀系数,并且在只读数据库中 - 我看到绕在上面的查询没有办法在声明中两次。
看到它的行动:SQL Fiddle。
请评论如果和因为这需要调整/进一步的细节。
为什么不创建一个在db中插入消息日期的日期时间列? – Santiago
@Santiago time_sent的列实际上是一个日期时间,而不仅仅是时间。编辑帖子澄清。另外,正如笔记中提到的那样,它是一个只读数据库。 – Brandon
您是否要求提供* all *用户的百分比,或者只有那些收到至少一条消息的用户? – trincot