我过去曾构建过具有复杂查询的网站(无论如何对我来说),但我决定,由于我的编程方式,我应该在构建我的网站之前提出我需要的数据库查询。这样我可以避免重新构建等,但我没有实际的数据可以使用。因此,用户将在我的网站上发帖。然后任何其他用户都可以重新发布该帖子(我称之为“TRICKLE”)。我需要根据每个标签的重新发布次数获取前 5 个帖子。 因此,如果“棒球”是标签,并且 3000 个用户发布了带有该标签的帖子,那么我需要获取重新发布的前 5 个帖子。 结构:
POSTS
-post_id
-member_id
-tag
-title
-post
-date_posted
-is_active
TRICKLES
-post_id
-member_id
-date_trickled
我有这个查询,我认为是这样的..
select p.post_id, p.tag, p.title, count(p.post_id) from (
select * from posts p inner join
trickles t on t.post_id=p.post_id
group by p.tag order by count(p.post_id) desc limit 5
) order by p.tag asc
对我来说这就是说。 首先(内部查询)获取所有帖子及其相关的trickle(重新发布) 按标签对它们进行分组,然后按每个帖子的最高计数进行排序,并将其限制为 5。 然后获取id、标签、标题、计数(该帖子被点滴的总次数) 并按标签字母顺序排序
我认为这将为我提供数据库中每个组的前 5 个细流,但对我来说,在没有实际数据的情况下很难弄清楚这一点,而且直到人们加入并开始发帖之前我不会这样做。每当我开始深入思考这个问题时,我都感觉自己的思绪变得困惑。 根据我所说的,这个查询能让我获得数据库中每个常见“标签”的前 5 个转发吗?我提前感谢这一点!
最佳答案
我想这个行枚举的技巧会对你有所帮助。它有点复杂,但应该可以正常工作:
select
j.tag,
j.post_id,
j.title,
j.cnt
from (
select
case when @b <> i.tag then (select @a := 0) end tmp1,
case when @b <> i.tag then (select @b := i.tag) end tmp2,
(select @a := @a + 1) num,
i.*
from (
select
p.title,
p.post_id,
p.tag,
count(*) cnt
from posts p
left join tickles t on t.post_id = p.post_id
group by
p.post_id, p.tag, p.title
order by p.tag, count(*) desc
) i
left join (select @a := 0, @b := '') x on 1=1
) j
where j.num <= 5
关于Mysql 在内连接上获得每组前 5 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9987336/