15

好的...好吧,我必须将子查询放在一个JOIN子句中,因为它选择了多个列,并且将其放在SELECT子句中不允许这样做,因为它给了我一个操作数错误。任何人,这是我的查询:

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 语句将进入一个 foreach 循环,该循环围绕在我的 main_cat 中找到的一般类别进行循环。所以有 5 个主要类别和 3-8 个子类别。这是子类别查询。但是对于每个子类别,我需要获取最新的帖子。但是,它只为每个主要类别运行此 SELECT 查询,因此它只选择所有子类别组合之间的最新帖子...我想获取每个子类别的最新帖子,但我宁愿不对每个子类别运行此查询......因为我希望页面加载速度更快。但请记住,一些子类别不会有最新的帖子,因为其中一些甚至可能不包含主题!因此,左连接。

有谁知道该怎么做?

(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个主要类别。

4

1 回答 1

26

如果不查看表的 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
于 2013-01-29T06:13:20.963 回答