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

时间:2009-10-13 16:40:44

标签: mysql

编辑:

让我对我所追求的内容更具体:

catID,cat1,cat2,cat3,cat4,pri_color,sec_color和cat_name都与每个特定类别相关。

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

userID,forum_id,title,alias,created和paragraph对应于每个类别中的最新帖子。

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


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

我目前的查询如下:

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

它给了我几乎所有正确的信息,除了实际的最新帖子。我想我的主要罪魁祸首是我对JOINS和GROUP BY缺乏经验。它似乎是以这样一种方式对数据进行分组,它为我提供了最新创建的时间戳,但却是最古老的论坛帖子。

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


FORUM

id      int(10) unsigned NO PRI NULL auto_increment
userID      int(10) unsigned NO MUL 0
catID       int(3)  unsigned NO MUL 0
regID       int(3)  unsigned NO MUL 0
approved    enum('yes','no') NO MUL yes
title       varchar(150) NO MUL paragraph text NO NULL
view        int(10) unsigned NO 1
created     int(10) unsigned NO 0
modified    int(10) unsigned NO MUL 0
ip      varchar(15) NO
oldID       int(10) unsigned NO 0
comments    int(4) NO MUL 0
responses   int(4) NO 0
pics        int(4) NO MUL 0 

USERS

user_id     int(10) unsigned NO PRI NULL auto_increment   
id      int(10) unsigned NO MUL 0     
alias       varchar(50) NO MUL new     
email       varchar(150) NO MUL       
fname       varchar(30) NO MUL       
lname       varchar(30) NO MUL       
address     varchar(200) NO         
city        varchar(50) NO         
state       varchar(50) NO         
zip         varchar(20) NO         
country     varchar(50) NO         
job         varchar(150) NO         
phone       varchar(30) NO         
url         varchar(200) NO         
pref_news   enum('yes','no') NO   no     
pref_contact    enum('yes','no') NO   yes     
pref_summary    int(3) NO   20     
pref_showLoc    enum('yes','no') NO   no     
pref_showName   enum('yes','no') NO   no     
pref_showEmail  enum('yes','no') NO   no     
pref_showUrl    enum('yes','no') NO   no     

CATEGORY

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   

2 个答案:

答案 0 :(得分:0)

您的查询(为清晰起见重新格式化):

   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);

答案 1 :(得分:0)

帐户创建存在问题,我不能编辑我的帖子,但是......

此查询:

SELECT DISTINCT category.id,category.cat1,category.cat2,category.cat3,category.cat4,category.pri_color,category.sec_color,SUM(forum.view)AS sum_views,COUNT(forum.id)AS count_posts FROM category,forum WHERE forum.catID = category.id AND category.area ='forum'AND forum.approved ='yes'GROUP BY category.id

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