【发布时间】: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
有什么问题?
我没有选择最后一条消息,而是一条随机消息。
有人可以帮我解决这个问题吗? :)
提前致谢!
【问题讨论】:
-
在第四次连接时尝试使用右连接而不是左连接。
-
那行不通。通过正确的加入,我没有得到所有的子类别,只有最后一个。