【发布时间】:2012-10-23 13:46:13
【问题描述】:
我有一个查询,它会像这样按降序返回结果。
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;
我怎样才能做到这一点?
【问题讨论】:
-
我想从一个有限制的子查询中获取 cmets 表,而不是直接连接。可能相关:stackoverflow.com/q/2856397/438971
-
谢谢回复,但你能通过在查询中指定它来帮助我吗?
-
您是否查看了答案中 cmets 中的链接? MySQL中的高级采样,有点迷惑:explainextended.com/2009/03/06/advanced-row-sampling
-
我看了但没看懂。
-
刚刚做了一个示例,使用我使用的数据库中的订单表来显示前 10 名客户的所有订单(按订单数量),以显示方法:
SELECT o.`customer_id`, o.`order_id`, o.`total_price` FROM `orders` o JOIN (SELECT oo.`customer_id` FROM `orders` oo GROUP BY oo.`customer_id` ORDER BY COUNT(oo.`order_id`) DESC LIMIT 10) ooo ON o.`customer_id` = ooo.`customer_id`
标签: mysql greatest-n-per-group