JOIN子句中的MYSQL子查询SELECT

时间:2013-01-23 15:54:19

标签: mysql subquery

好的......我必须将子查询放在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个主要类别。

1 个答案:

答案 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