选择类别中的最后一条消息


selecting the last message in a category

我有一个问题与以下查询:(注意,长查询!!)

SELECT
            c.frm_category_id,
            c.name,
            c.slug,
            s.frm_category_id,
            s.name,
            s.slug,
            s.description,
            IFNULL(topics_count,0),
            IFNULL(messages_count,0),
            n.frm_message_id,
            n.user_id,
            n.frm_topic_id,
            n.timestamp,
            n.title,
            n.slug,
            u.account_type,
            u.username
FROM
            frm_categories AS c
LEFT JOIN(
            SELECT
                    frm_category_id,
                    parent_frm_category_id,
                    name,
                    slug,
                    description
            FROM
                    frm_categories
            WHERE
                    parent_frm_category_id != 0
) AS s
            ON
                    c.frm_category_id = s.parent_frm_category_id    
LEFT JOIN(
            SELECT
                    frm_category_id,
                    frm_topic_id,
                    COUNT(frm_topic_id) AS topics_count
            FROM
                    frm_topics
            GROUP BY
                    frm_category_id
) AS t
            ON
                    s.frm_category_id = t.frm_category_id
LEFT JOIN(
            SELECT
                    COUNT(frm_message_id) AS messages_count,
                    frm_topic_id,
                    frm_category_id
            FROM
                    frm_messages
            GROUP BY
                    frm_category_id
) AS m
            ON
                    t.frm_topic_id = m.frm_topic_id
LEFT JOIN(
            SELECT
                    MAX(m.frm_message_id) AS frm_message_id,
                    m.user_id,
                    m.frm_category_id,
                    m.frm_topic_id,
                    m.timestamp,
                    t.title,
                    t.slug
            FROM
                    frm_messages AS m,
                    frm_topics AS t
            WHERE
                    m.frm_topic_id = t.frm_topic_id
            GROUP BY
                    m.frm_topic_id
) AS n
            ON
                    s.frm_category_id = n.frm_category_id
LEFT JOIN
                    users AS u
            ON
                    n.user_id = u.user_id
            WHERE
                    c.parent_frm_category_id = 0
ORDER BY
            c.frm_category_id ASC,
            s.frm_category_id ASC

解释:

SELECT =>我选择父类别的category_id,name和slug(因为WHERE parent_frm_category_id = 0)

FIRST LEFT JOIN =>我选择父类别的子类别(多于1)

SECOND LEFT JOIN =>我计算每个子类别中的所有主题

THIRD LEFT JOIN =>我计算每个子类别中的所有消息

第四个左JOIN =>我选择每个子类别的最后一条消息(出错的地方)

第五个左JOIN =>我选择每个子类别的最后一条消息的account_type和用户名

有什么问题吗?

I不选择最后一条消息,而是一个随机消息。

有人能帮我一下吗?:)

提前感谢!

这能满足您的需求吗?

SELECT  c.frm_category_id,
        c.name,
        c.slug,
        s.frm_category_id,
        s.name,
        s.slug,
        s.description,
        IFNULL(topics_count,0),
        IFNULL(messages_count,0),
        n.frm_message_id,
        n.user_id,
        n.frm_topic_id,
        n.timestamp,
        n.title,
        n.slug,
        u.account_type,
        u.username
FROM frm_categories AS c
    LEFT JOIN frm_categories s ON s.frm_category_id = c.parent_frm_category_id AND s.parent_frm_category_id != 0
    LEFT JOIN(
        SELECT  frm_category_id,
                COUNT(frm_topic_id) AS topics_count
        FROM frm_topics
        GROUP BY frm_category_id
    ) AS t ON t.frm_category_id = s.frm_category_id
    LEFT JOIN(
            SELECT  COUNT(frm_message_id) AS messages_count,
                    frm_category_id
            FROM frm_messages
            GROUP BY frm_category_id
    ) AS m ON m.frm_category_id = t.frm_category_id
    LEFT JOIN(
            SELECT  MAX(m.frm_message_id) AS frm_message_id,
                    m.user_id,
                    m.frm_category_id,
                    m.frm_topic_id,
                    m.timestamp,
                    t.title,
                    t.slug
            FROM frm_messages AS m,
                    frm_topics AS t
            WHERE m.frm_topic_id = t.frm_topic_id
            GROUP BY m.frm_category_id
    ) AS n ON s.frm_category_id = n.frm_category_id
    LEFT JOIN users AS u ON n.user_id = u.user_id
WHERE c.parent_frm_category_id = 0
ORDER BY c.frm_category_id ASC, s.frm_category_id ASC