【问题标题】:selecting the last message in a category选择类别中的最后一条消息
【发布时间】:2017-02-20 11:11:31
【问题描述】:

我对以下查询有疑问:(请注意,长查询!!)

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 => 我选择了 PARENT 类别的 category_id、name 和 slug(因为 WHERE parent_frm_category_id = 0)

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

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

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

FOURTH LEFT JOIN => 我选择每个子类别的最后一条消息(哪里出错了

FIFTH LEFT JOIN => 我选择每个子类别的最后一条消息的 account_type 和 username

有什么问题?

我没有选择最后一条消息,而是一条随机消息。

有人可以帮我解决这个问题吗? :)

提前致谢!

【问题讨论】:

  • 在第四次连接时尝试使用右连接而不是左连接。
  • 那行不通。通过正确的加入,我没有得到所有的子类别,只有最后一个。

标签: php mysql join


【解决方案1】:

这能满足你的需要吗:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2022-11-13
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多