创建论坛,并尝试按时间戳对两个表进行排序。一个表主题和其他答复。我该如何分类呢?

时间:2014-06-13 16:04:32

标签: php mysql sql sorting

我正在尝试按时间戳对论坛创建的两个表进行排序。

我已经搜索过没有运气了。请帮忙。

我的第一张桌子是" forum_posts"和时间戳是" forum_timestamp" 我的第二张桌子是" forum_posts_replys"是" fpr_timestamp"

使用以下查询,我可以按时间戳或其他查询排序,但我想对两者进行排序。如果主题中没有任何回复并且它刚刚发布我想在顶部看到它,但如果在另一个主题中有回复,我希望首先显示该回复。

                (SELECT fp.*, fpr.*
            FROM forum_posts fp
            LEFT JOIN forum_posts_replys fpr
            ON fp.forum_post_id = fpr.fpr_post_id
            WHERE `fp`.`forum_id`='$f_id'
            GROUP BY fp.forum_post_id)
            ORDER BY `forum_timestamp` DESC

我也试过GREATEST()但没有运气。

我尝试使用此页面的主页是主题列表页面。该页面只显示主题及其标题和回复计数以及每个帖子的发布时间。

我当前的查询06/14/14:

                SELECT sub.*
            FROM
            (SELECT 
             fp.forum_post_id as forum_post_id, fp.forum_id as forum_id, 
             fp.forum_user_id as forum_user_id, fp.forum_title as forum_title, 
             fp.forum_content as forum_content, fp.forum_edit_date as forum_edit_date,
             fp.forum_timestamp as forum_timestamp, fpr.id as id,
             fpr.fpr_post_id as fpr_post_id, fpr.fpr_id as fpr_id,
             fpr.fpr_user_id as fpr_user_id, fpr.fpr_title as fpr_title,
             fpr.fpr_content as fpr_content, fpr.fpr_edit_date as fpr_edit_date,
             fpr.fpr_timestamp as fpr_timestamp,
             ifnull(fpr.fpr_timestamp,forum_timestamp) as tstamp
            FROM forum_posts fp
            LEFT JOIN forum_posts_replys fpr
            ON fp.forum_post_id = fpr.fpr_post_id
            WHERE `fp`.`forum_id`='$f_id'
            GROUP BY fp.forum_post_id) sub

            ORDER BY tstamp DESC

仍然只能按forum_timestamp

排序

2 个答案:

答案 0 :(得分:1)

使用子查询。

        SELECT fp.*, fpr.*
        from

        (SELECT fp.*, fpr.*, ifnull(fpr.fpr_timestamp,forum_timestamp) as tstamp
        FROM forum_posts fp
        LEFT JOIN forum_posts_replys fpr
        ON fp.forum_post_id = fpr.fpr_post_id
        WHERE `fp`.`forum_id`='$f_id'
        GROUP BY fp.forum_post_id) sub

        order by tstamp desc

编辑:显式列出所需字段,并使用子查询的表别名:

        SELECT sub.*
        from

        (SELECT fp.field_1 as f1, fp.field_2 as f2, fpr.field_1 as f3, fpr.field_2 as f4, ifnull(fpr.fpr_timestamp,forum_timestamp) as tstamp
        FROM forum_posts fp
        LEFT JOIN forum_posts_replys fpr
        ON fp.forum_post_id = fpr.fpr_post_id
        WHERE `fp`.`forum_id`='$f_id'
        GROUP BY fp.forum_post_id) sub

        order by tstamp desc

答案 1 :(得分:0)

在您的帮助下,我能够排除故障以使其正常工作!

这是完美无缺的最终查询。

                SELECT sub.*
            FROM
            (SELECT 
                fp.forum_post_id as forum_post_id, fp.forum_id as forum_id, 
                fp.forum_user_id as forum_user_id, fp.forum_title as forum_title, 
                fp.forum_content as forum_content, fp.forum_edit_date as forum_edit_date,
                fp.forum_timestamp as forum_timestamp, fpr.id as id,
                fpr.fpr_post_id as fpr_post_id, fpr.fpr_id as fpr_id,
                fpr.fpr_user_id as fpr_user_id, fpr.fpr_title as fpr_title,
                fpr.fpr_content as fpr_content, fpr.fpr_edit_date as fpr_edit_date,
                fpr.fpr_timestamp as fpr_timestamp,     
                GREATEST(fp.forum_timestamp, COALESCE(fpr.fpr_timestamp, '00-00-00 00:00:00')) AS tstamp
                FROM forum_posts fp
                LEFT JOIN forum_posts_replys fpr
                ON fp.forum_post_id = fpr.fpr_post_id
                WHERE fp.forum_id=$f_id
                ORDER BY tstamp DESC
            ) sub

            GROUP BY forum_post_id
            ORDER BY tstamp DESC