Mysql 在内连接上获得每组前 5 个结果

标签 mysql group-by inner-join greatest-n-per-group

我过去曾构建过具有复杂查询的网站(无论如何对我来说),但我决定,由于我的编程方式,我应该在构建我的网站之前提出我需要的数据库查询。这样我可以避免重新构建等,但我没有实际的数据可以使用。因此,用户将在我的网站上发帖。然后任何其他用户都可以重新发布该帖子(我称之为“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/

相关文章:

mysql - 如何仅返回一列中不同的结果,同时允许其他列中出现重复结果?

sql - 奇数 INNER JOIN 语法和封装

php - 从搜索中返回其他列数据

sql - 使用 group by 时出错

javascript - 重新加载div而不刷新整个页面

mysql - SQL查询分组依据和全部

python - Pandas 按组使用第一个有效索引删除 nan

mysql - 如何使我的 SQL 内部联接绕过表?

php - 如何限制一段时间的mysql_array?

MySQL 链接表获取插入的最后一行 table.value = X