背景:
MySQL的:
(SELECT *
FROM (SELECT *
FROM post
ORDER BY post_timestamp DESC
LIMIT 0, 10) AS p
JOIN user_profiles
ON user_id = p.post_author_id
LEFT JOIN (SELECT *
FROM data
JOIN pts
ON pts_id = pts_id_fk) AS d
ON d.data_id = p.data_id_fk
LEFT JOIN (SELECT *
FROM comment
JOIN user_profiles
ON user_id = comment_author_id
ORDER BY comment_id ASC) AS c
ON p.post_id = c.post_id_fk))
我未能在此代码中插入LIMIT
和COUNT
以获得我想要的内容 - 任何建议? - 如果需要,将很乐意发布更多信息。
答案 0 :(得分:0)
如果我正确理解你,你想要在返回的结果集中为每个唯一用户返回不超过10篇帖子(和2条评论)。
使用“row_number()PARTITION BY”在SQLServer / Oracle / Postgre中非常容易。
不幸的是MySql中没有这样的功能。这里也提出了类似的问题:
ROW_NUMBER() in MySQL
对不起,我无法为MySql提供更具体的解决方案。绝对进一步研究MySql的“行号分区”等价物。
这样做的本质:
您可以添加一组构成唯一集合的列,例如用户ID,例如缘故(这是“分区”)然后将“行号”列添加到与该分区匹配的每一行并重新开始当它发生变化时。
这应该说明:
user_id row_number
1 1
1 2
1 3
2 1
2 2
然后,您可以添加一个外部查询,其中说明:select row_number< = 10,在您的情况下可以使用它来限制不超过10个帖子。使用该用户的max row_number来确定“读取所有10条评论”部分。
祝你好运!答案 1 :(得分:0)
这是您正在寻找的查询的骨架:
select * from (
select p1.id from posts p1
join posts p2 on p1.id <= p2.id
group by p1.id
having count(*) <= 3
order by p1.post_timestamp desc
) p left join (
select c1.id, c2.post_id from comments c1
join comments c2 on c1.id <= c2.id and c1.post_id = c2.post_id
group by c1.id
having count(*) <= 2
order by c1.comment_timestamp desc
) c
on p.id = c.post_id
它会按照下降时间戳排序,但只有前三个。该结果将通过下降时间戳与每个帖子顺序的前2个评论相结合。只需更改列名称即可使用:)