首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行MySQL -n- subForums之前,将论坛及其subForums分组到同一组中

在执行MySQL -n- subForums之前,将论坛及其subForums分组到同一组中
EN

Stack Overflow用户
提问于 2012-04-13 07:02:38
回答 1查看 82关注 0票数 0

在网页上,我希望显示论坛列表(parent_id = 0),并为每个论坛显示该论坛及其subForums组中的最新(最新)3个主题

代码语言:javascript
复制
APPLE (Forum)
 iPad3        Apr 12   (Topic from subForum "Tablets")
 Genius Bar   Apr 11   (Topic from Forum "APPLE")
 iPodNano     Apr 10   (Topic from subForum "Portables")
repeat with next forum

MySQL 5.5结构

代码语言:javascript
复制
table FORUMS (contains Forums and subForums, 2 level hierarchy max)
 id (autoinc)
 parent_id (0 if Forum, link to other rows id if subForum)
 name


table TOPICS (a Topic is a child of Forums or subForums)
 id (autoinc)
 forum_id (linked to FORUMS table
 name
 date_added (datetime)

我可以从一个简单的查询中获得论坛的结果集,并将其放入PHP中的一个数组中,然后循环执行。

我被困在如何创建第二个显示前3个主题的结果集上。

我已经阅读了关于Greatest-N-Per-Group的文章,并尝试了它们,但我认为我的想法增加了一定程度的复杂性。在这一点上我的大脑一团糟,所以我在寻求帮助。

我是否要创建一个mysql变量来保存论坛id的逗号分隔列表和它的subForums,然后将其用于IN (1,4,6)语句的值?

或者这是一个糟糕的设计/想法,执行成本太高?

我已经阅读了很多关于SO的相关文章,但是任何你也可以给我指点的链接我也会读的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-13 08:36:25

由于您的问题不够清晰,我不得不做一些假设,但您应该能够修改它以适应您的表/字段名。我在最里面的查询中包含了一个基于日期的过滤器,试图减少开销。您可能需要修改topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)标准,以确保每个论坛组始终有3个条目-

代码语言:javascript
复制
SELECT *
FROM (
    SELECT
        tmp.*,
        @rank := IF(@forum=forum_id, @rank + 1, 1) rank, 
        @forum := forum_id
    FROM (
        SELECT
            forums.id AS forum_id,
            forums.name AS forum_name,
            NULL AS subforum_id,
            NULL AS subforum_name,
            topics.name AS topic_name,
            topics.date_added
        FROM forums
        INNER JOIN topics
            ON (forums.id = topics.forum_id)
        WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)
        AND forums.parent_id = 0
        UNION ALL
        SELECT
            forums.id AS forum_id,
            forums.name AS forum_name,
            subforums.id AS subforum_id,
            subforums.id AS subforum_name,
            topics.name AS topic_name,
            topics.date_added
        FROM forums
        INNER JOIN forums subforums
            ON forums.id = subforums.parent_id
        INNER JOIN topics
            ON subforums.id = topics.forum_id
        WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)
        AND forums.parent_id = 0
        ORDER BY forum_id ASC, date_added DESC
    ) tmp, (SELECT @forum:=NULL, @rank:=NULL) initvars
) tmp2
WHERE rank <= 3

注意:我没有尝试过这样做,所以可能有语法错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10133068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档