编辑:
让我对我所追求的内容更具体:
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
答案 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
有效地处理所有处理类别表信息的查询。现在我只需要知道如何将它链接到每个类别的最新帖子。