好的......我必须将子查询放在JOIN
子句中,因为它选择了多个列并将它放在SELECT
子句中不允许这样,因为它给了我一个错误一个操作数。
Anywho,这是我的疑问:
SELECT
c.id,
c.title,
c.description,
c.icon,
p.id as topic_id,
p.title AS topic_title,
p.date,
p.username
FROM forum_cat c
LEFT JOIN (
SELECT
ft.id,
ft.cat_id,
ft.title,
fp.date,
u.username
FROM forum_topic ft
JOIN forum_post fp ON fp.topic_id = ft.id
JOIN user u ON u.user_id = fp.author_id
WHERE ft.cat_id = c.id
ORDER BY fp.date DESC
LIMIT 1
) p ON p.cat_id = c.id
WHERE c.main_cat = ?
ORDER BY c.list_no
现在我需要这个重要的事情...... FOR EACH
类别,我想在每个类别中显示最新的帖子和主题标题。
但是,这个select语句是INSIDE一个foreach循环,循环遍历我的main_cat的常规类别。
所以有5个主要类别有3-8个子类别。这是子类别查询。但是对于每个子类别,我需要获取最新的帖子..但是,它只为每个主要类别运行此SELECT查询,因此它只选择所有子类别之间的最新帖子...我想获得每个子类别的最新帖子,但我宁愿不为每个子类别运行此查询...因为我希望页面加载速度快。
但请记住,有些子类别没有最新的帖子,因为其中一些可能还没有包含主题!因此,左连接。
有谁知道如何做到这一点?
AND BTW,它在子查询中给出(WHERE ft.cat_id = c.id)
时出错,因为c.id
是一个未知列。但是我试图从外部查询引用它,所以有人可以在这个问题上帮助我吗?
谢谢!
所有表格:
forum_cat (Subcategories)
-----------------------------------------------
ID, Title, Description, Icon, Main_cat, List_no
forum_topic (Topics in each subcategory)
--------------------------------------------
ID, Author_id, Cat_id, Title, Sticky, Locked
forum_post (Posts in each topic)
--------------------------------------------
ID, Topic_id, Author_id, Body, Date, Hidden'
主要类别列在一个函数中。我没有将它们存储在数据库中,因为它们是浪费空间,因为它们永远不会改变。虽然有7个主要类别。
答案 0 :(得分:15)
如果没有看到表格的DDL,相关的样本数据和所需的输出,很难说清楚。
我可能会错误地提出您的要求,但请尝试以下方法:
SELECT *
FROM forum_cat c LEFT JOIN
(SELECT t.cat_id,
p.topic_id,
t.title,
p.id,
p.body,
MAX(p.`date`) AS `date`,
p.author_id,
u.username
FROM forum_post p INNER JOIN
forum_topic t ON t.id = p.topic_id INNER JOIN
`user` u ON u.user_id = p.author_id
GROUP BY t.cat_id) d ON d.cat_id = c.id
WHERE c.main_cat = 1
ORDER BY c.list_no