gpt4 book ai didi

mysql - 为结果集中的每个id获取 `n`行MYSQL

转载 作者:可可西里 更新时间:2023-11-01 08:20:41 26 4
gpt4 key购买 nike

我有一个查询,它按这样的降序返回结果。

  comment     postid      name      userid    tempid
-----------------------------------------------------
c1 199 User1 123321 1
c2 199 User1 123321 2
c3 199 User1 123321 3
c4 199 User1 123321 4
c5 199 User1 123321 5
c6 199 User1 123321 6
c7 198 User1 123321 7
c8 198 User1 123321 8
c9 198 User1 123321 9
c10 197 User1 123321 10
c11 197 User1 123321 11
c12 197 User1 123321 12
c13 197 User1 123321 13
c14 197 User1 123321 13
c15 197 User1 123321 13
c16 197 User1 123321 13

现在我想为每个 postid 选择前 5 条记录。期望的结果应该是

  comment     postid      name      userid    tempid
-----------------------------------------------------
c1 199 User1 123321 1
c2 199 User1 123321 2
c3 199 User1 123321 3
c4 199 User1 123321 4
c5 199 User1 123321 5
c7 198 User1 123321 7
c8 198 User1 123321 8
c9 198 User1 123321 9
c10 197 User1 123321 10
c11 197 User1 123321 11
c12 197 User1 123321 12
c13 197 User1 123321 13
c14 197 User1 123321 13

这是我的查询。

 DECLARE rangee INT;
DECLARE uid BIGINT;

SET @rangee = plimitRange * 10;
SET @uid = puserid;

PREPARE STMT FROM
'
SELECT comments.comment,comments.postid,user.name,comments.userid,comments.tempid
FROM
user
INNER JOIN comments ON user.userid=comments.userid
INNER JOIN posts ON posts.postID = comments.postid
WHERE
comments.postid <=
(SELECT MAX(postid) FROM
(
SELECT wall.postid FROM wall,posts WHERE
wall.postid = posts.postid AND posts.userid=?
ORDER BY wall.postid DESC LIMIT 10 OFFSET ?
)sq1
)

AND
comments.postid >=
(SELECT MIN(postid) FROM
(
SELECT wall.postid FROM wall,posts WHERE
wall.postid = posts.postid AND posts.userid=?
ORDER BY wall.postid DESC LIMIT 10 OFFSET ?
)sq2
)

AND
posts.userid = ?
ORDER BY comments.postid DESC,comments.tempid DESC;
';
EXECUTE STMT USING @uid,@rangee,@uid,@rangee,@uid;
DEALLOCATE PREPARE STMT;

我怎样才能做到这一点?

最佳答案

您必须使用子查询来实现一个表,该表包含每个组(按帖子)中每条记录(评论)的排名。然后,在外部查询中,您可以仅过滤那些排名在所需范围内的记录(例如,[1,5] 用于前 5 名):

-- select top 5 comments of each of the user's desired posts
SELECT comments.comment,
comments.postid,
user.name,
comments.userid,
comments.tempid
FROM user JOIN (
-- rank comments on user's desired posts by grouping a self-join
-- use index (postid, tempid) for performance
SELECT c1.*, COUNT(*) rank
FROM (
-- select user's posts within desired range
SELECT postid
FROM (
-- rank user's posts by grouping a self-join
-- use index (userid, postid) for performance
SELECT p1.postid, COUNT(*) rank
FROM posts p1
LEFT JOIN posts p2
ON p1.userid = p2.userid
AND p1.postid < p2.postid
WHERE p1.userid = @uid
GROUP BY p1.postid
) ranked_posts
WHERE rank BETWEEN @rangee + 1 AND @rangee + 10
) interesting_posts
JOIN comments c1 USING (postid)
LEFT JOIN comments c2
ON c1.postid = c2.postid
AND c1.tempid < c2.tempid
GROUP BY c1.postid
) comments USING (userid)
WHERE comments.rank BETWEEN 1 AND 5
ORDER BY postid DESC, tempid DESC

关于mysql - 为结果集中的每个id获取 `n`行MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13031910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com