Как получить последние сообщения для каждой категории в этом форуме, используя MySQL? - PullRequest
0 голосов
/ 13 октября 2009

EDIT:

Позвольте мне быть более точным в том, что я ищу:

catID, cat1, cat2, cat3, cat4, pri_color, sec_color и cat_name относятся к каждой конкретной категории.

Поле sum_views должно соответствовать сумме всех просмотров на форуме для этой конкретной категории. Поле count_posts должно соответствовать количеству сообщений на форуме для этой категории.

ИД пользователя, идентификатор форума, заголовок, псевдоним, созданный и абзац соответствуют последнему сообщению в каждой категории.

Другими словами, для каждой категории мне нужна информация о соответствующей категории, сводная статистика форума для каждой категории и, наконец, самое новое сообщение в каждой категории.


Мне дали небольшой проект для создания вида форума для нашей существующей системы. В этом случае мне нужно найти самый новый пост (и другую информацию) в каждой категории форума.

Мой текущий запрос выглядит следующим образом:

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. Кажется, данные сгруппированы таким образом, что я получаю самую новую созданную временную метку, но самую старую запись на форуме.

Обратите внимание, что на данный момент я не могу изменить структуру таблицы или создать таблицу кеша в текущем программном обеспечении, хотя мы собираемся заменить ее в ближайшем будущем. Кроме того, поле id в таблице USERS является внешним ключом для другой таблицы.


Форум

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 

ПОЛЬЗОВАТЕЛИ

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     

КАТЕГОРИЯ

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 голосов
/ 14 октября 2009

У меня была проблема с созданием аккаунта, из-за которой я не мог редактировать свое сообщение, но ...

Этот запрос:

SELECT DISTINCT category.id, category.cat1, category.cat2, category.cat3, category.cat4, category.pri_color, category.sec_color, SUM (forum.view) AS ОТ категории, форум ГДЕ forum.catID = category.id И category.area = 'форум' И forum.approved = 'да' GROUP BY category.id

эффективно заботится обо всех запросах, связанных с информацией таблицы категорий. Теперь мне просто нужно знать, как связать его с последним сообщением для каждой категории.

0 голосов
/ 13 октября 2009

Ваш запрос (переформатирован для ясности):

   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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...