如何使用MySQL获取论坛中每个类别的最新帖子?

如何使用MySQL获取论坛中每个类别的最新帖子?,mysql,Mysql,编辑: 让我更具体地说明我的目标: catID、cat1、cat2、cat3、cat4、pri_颜色、sec_颜色和cat_名称都与每个特定类别相关 sum_views字段应与论坛中该特定类别的所有视图的总和相对应。 count_posts字段应与该类别论坛中的帖子数量相对应 用户id、论坛id、标题、别名、创建的内容和段落对应于每个类别中的最新帖子 换句话说,对于每个类别,我需要相应的类别信息,每个类别的聚合论坛统计数据,最后是每个类别中的最新帖子 我得到一个小项目,为我们现有的系统创建一个

编辑:

让我更具体地说明我的目标:

catID、cat1、cat2、cat3、cat4、pri_颜色、sec_颜色和cat_名称都与每个特定类别相关

sum_views字段应与论坛中该特定类别的所有视图的总和相对应。 count_posts字段应与该类别论坛中的帖子数量相对应

用户id、论坛id、标题、别名、创建的内容和段落对应于每个类别中的最新帖子

换句话说,对于每个类别,我需要相应的类别信息,每个类别的聚合论坛统计数据,最后是每个类别中的最新帖子


我得到一个小项目,为我们现有的系统创建一个论坛类型的视图。在这种情况下,我需要在每个论坛类别中找到最新的帖子(和其他信息)

我目前的查询如下:

SELECT DISTINCT forum.catID AS catID, category.cat1 AS cat1, 
category.cat2 AS cat2, 
category.cat3 AS cat3, 
category.cat4 AS cat4, 
SUM(forum.view) AS sum_views, 
COUNT(forum.id) AS count_posts, 
category.pri_color AS pri_color, 
category.sec_color AS sec_color, 
category.name AS cat_name, 
forum.userID AS userID, 
forum.id AS forum_id, 
forum.title AS title, 
users.alias AS alias, 
MAX(forum.created) AS created, 
forum.paragraph AS paragraph 
FROM forum, category, users 
WHERE forum.approved = 'yes' 
AND users.id = forum.userID 
AND forum.catID = category.id 
GROUP BY forum.catID 
ORDER BY category.name
它给了我几乎所有我想要的正确信息,除了最新的帖子。我想我的罪魁祸首是我缺乏加入和分组的经验。它似乎以这样一种方式对数据进行分组,它给了我最新创建的时间戳,但却是最古老的论坛帖子

请注意,目前我无法在当前软件中更改表结构或创建缓存表,尽管我们将在不久的将来构建一个替换表。此外,USERS表中的id字段是另一个表的外键


论坛

使用者

类别

id      int(10) unsigned NO PRI NULL auto_increment
area        enum('article','classifieds','news','forum') NO   forum   
level       enum('1','2','3','4') NO   1   
cat1        int(10) NO   0   
cat2        int(10) unsigned NO   0   
cat3        int(10) unsigned NO   0   
cat4        int(10) unsigned NO   0   
name        varchar(150) NO       
pri_color   varchar(6) NO       
sec_color   varchar(6) NO       
right_nav   text NO   NULL   
left_ad     text NO   NULL   
footer_ad   text NO   NULL   
top_ad      text NO   NULL   
您的查询(为清晰起见,已重新格式化):

查询的问题是聚合数据不能与未聚合数据逻辑关联。例如,特定类别的聚合计数不适用于任何特定用户。因此,您要么希望单独获取聚合数据,要么希望按用户信息分组:

SELECT c.name,c.pri_color, c.sec_color,
       cats.ualias,
       cats.sum_views, cats.count_posts, cats.created
       c.cat1, c.cat2, c.cat3, c.cat4,
FROM categories c JOIN
    (SELECT f.catID, u.alias AS ualias
           SUM(f.view) as sum_views, 
           COUNT(f.id) as count_posts, 
           MAX(f.created) as created
    FROM forum f JOIN users u ON (f.userID=u.id)
    WHERE f.approved='yes'
    GROUP BY f.catID, u.alias) AS cats
ON (c.id=cats.catID);

帐户创建有问题,不允许我编辑我的帖子,但是

此查询:

选择不同的category.id、category.cat1、category.cat2、category.cat3、category.cat4、category.pri_color、category.sec_color、SUM(forum.view)作为SUM_视图,COUNT(forum.id)作为category中的COUNT_帖子,其中forum.catID=category.id和category.area='forum'和forum.approved='yes'按类别分组。id


有效地处理所有处理类别表信息的查询。现在我只需要知道如何将它链接到每个类别的最新帖子。

不幸的是,这并不能回答我的问题。我的错是措辞不够清楚。
id      int(10) unsigned NO PRI NULL auto_increment
area        enum('article','classifieds','news','forum') NO   forum   
level       enum('1','2','3','4') NO   1   
cat1        int(10) NO   0   
cat2        int(10) unsigned NO   0   
cat3        int(10) unsigned NO   0   
cat4        int(10) unsigned NO   0   
name        varchar(150) NO       
pri_color   varchar(6) NO       
sec_color   varchar(6) NO       
right_nav   text NO   NULL   
left_ad     text NO   NULL   
footer_ad   text NO   NULL   
top_ad      text NO   NULL   
   SELECT DISTINCT f.catID AS catID, 
                    c.cat1, c.cat2, c.cat3, c.cat4, 
                    SUM(f.view) AS sum_views, 
                    COUNT(f.id) AS count_posts, 
                    c.pri_color, c.sec_color, c.name AS cat_name,
                    f.userID AS userID, 
                    f.id AS forum_id, f.title, u.alias, 
                    MAX(f.created) AS created, 
                    f.paragraph
      FROM forum f JOIN users u ON (u.id = f.userID)
                   JOIN category c ON (f.catID = c.id)
      WHERE f.approved = 'yes'
    GROUP BY f.catID ORDER BY c.name
SELECT c.name,c.pri_color, c.sec_color,
       cats.ualias,
       cats.sum_views, cats.count_posts, cats.created
       c.cat1, c.cat2, c.cat3, c.cat4,
FROM categories c JOIN
    (SELECT f.catID, u.alias AS ualias
           SUM(f.view) as sum_views, 
           COUNT(f.id) as count_posts, 
           MAX(f.created) as created
    FROM forum f JOIN users u ON (f.userID=u.id)
    WHERE f.approved='yes'
    GROUP BY f.catID, u.alias) AS cats
ON (c.id=cats.catID);