Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Количество сообщений в подфоруме.
 
 автор: Unknown   (14.06.2007 в 22:27)   письмо автору
 
 

Есть три таблицы, которые хранят названии подфорумов, имя создаваемых тем и таблица, в которую записываются сообщения.
Как лучше реализовать подсчет количества сообщений в подфоруме.
1. Добавить в таблицу с подфорумами поле, которое будет увеличиваться при каждом добавлении сообщения.
2. Подсчитвать сколько тем в подфоруме, затем найти сообщения, у которых поле id_t равно id темы, которая находится в подфоруме.
Больше ниче придумать не могу.
Посоветуйте че-нить хорошее. :)

   
 
 автор: Trianon   (15.06.2007 в 01:04)   письмо автору
 
   для: Unknown   (14.06.2007 в 22:27)
 

структуру связей бы посмотреть ....

   
 
 автор: Unknown   (15.06.2007 в 02:22)   письмо автору
 
   для: Trianon   (15.06.2007 в 01:04)
 

Таблица forums, в которой содержатся названия подфорумов:

 id // первичный ключ
name // имя подфорума 

Таблица topics. Содержит названия тем и авторов.
 
id // первичный ключ 
name // имя темы
user // имя автора
fid // определяет к какому подфоруму относиться тема

Таблица posts. Содержит сообщения.
 
id //  первичный ключ
post // сообщение
name // имя автора
tid // определяет к какой теме относится пост.

   
 
 автор: Trianon   (15.06.2007 в 08:55)   письмо автору
 
   для: Unknown   (15.06.2007 в 02:22)
 


SELECT forums.id, forums.name, tcnt.cnt
 FROM forums LEFT JOIN 
  (SELECT COUNT(id) AS cnt, fid GROUP BY  fid ) 
 AS tcnt ON forums.id = tcnt.fid
 ORDER BY forums.name

   
 
 автор: Unknown   (15.06.2007 в 12:18)   письмо автору
 
   для: Trianon   (15.06.2007 в 08:55)
 

Этот запрос считает количество сообщений в темах подфорума, либо только количество тем?

   
 
 автор: Trianon   (15.06.2007 в 12:47)   письмо автору
 
   для: Unknown   (15.06.2007 в 12:18)
 

Тем.
А надо - сообщений?
Вместе с количеством собобщений будет так:


SELECT forums.id, forums.name, tcnt, pcnt 
 FROM forums LEFT JOIN  
  (SELECT COUNT(id) AS tcnt, fid 
  FROM topics GROUP BY  fid )  
 AS tcnt ON forums.id = tcnt.fid 
LEFT JOIN  
  (SELECT COUNT(id) AS pcnt, fid 
    FROM posts 
    JOIN topics ON posts.tid = topics.id
  GROUP BY  fid )  
 AS pcnt ON forums.id = pcnt.fid 
 ORDER BY forums.name 

Но запрос может выйти и вправду тяжелым.....
Имеет смысл посмотреть на практике

   
 
 автор: Unknown   (15.06.2007 в 13:38)   письмо автору
 
   для: Trianon   (15.06.2007 в 12:47)
 

Хотел сделать как здесь http://wen.ru/forum количество тем и количество сообщений. По ссылке тока количество сообщений. Количество тем я вывожу запросом
 "SELECT COUNT(id) FROM `topics` WHERE fid=".$id; 

Думаю лучше создать поле для количества сообщений и увеличивать/уменьшать значение при добавлении/удалении сообщений.

   
 
 автор: Trianon   (15.06.2007 в 13:44)   письмо автору
 
   для: Unknown   (15.06.2007 в 13:38)
 

>Хотел сделать как здесь http://wen.ru/forum количество тем и количество сообщений. По ссылке тока количество сообщений. Количество тем я вывожу запросом
 "SELECT COUNT(id) FROM `topics` WHERE fid=".$id; 


Так придется запрос в цикле повторять для каждого форума.
А то что написал я - запрашивается один раз для всей страницы.


>Думаю лучше создать поле для количества сообщений и увеличивать/уменьшать значение при добавлении/удалении сообщений.

Полагаю, имеет смысл поставить опыт.

   
 
 автор: Unknown   (15.06.2007 в 14:57)   письмо автору
 
   для: Trianon   (15.06.2007 в 13:44)
 


#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY  fid )  
AS tcnt ON forums.id = tcnt.fid 
ORDER BY 

Вот что выдает ваш запрос на количество тем.

   
 
 автор: Unknown   (15.06.2007 в 15:03)   письмо автору
 
   для: Trianon   (15.06.2007 в 13:44)
 

Второй запрос на количество сообщений выдает
 
#1052 - Column 'id' in field list is ambiguous 

   
 
 автор: Trianon   (15.06.2007 в 15:48)   письмо автору
 
   для: Unknown   (15.06.2007 в 15:03)
 

и что - не поправить?

SELECT forums.id, forums.name, tcnt, pcnt  
 FROM forums LEFT JOIN   
  (SELECT COUNT(id) AS tcnt, fid  
  FROM topics GROUP BY  fid )   
 AS tcnt ON forums.id = tcnt.fid  
LEFT JOIN   
  (SELECT COUNT(posts.id) AS pcnt, fid  
    FROM posts  
    JOIN topics ON posts.tid = topics.id 
  GROUP BY  fid )   
 AS pcnt ON forums.id = pcnt.fid  
 ORDER BY forums.name

   
 
 автор: Unknown   (15.06.2007 в 18:23)   письмо автору
 
   для: Trianon   (15.06.2007 в 15:48)
 

Блин. Я что-то не пойму. А что если не один подфорум, а несколько?
Все равно для каждого подфорума считать будет?

   
 
 автор: Trianon   (15.06.2007 в 18:29)   письмо автору
 
   для: Unknown   (15.06.2007 в 18:23)
 

Этот запрос считает для всех.

   
 
 автор: Unknown   (15.06.2007 в 18:47)   письмо автору
 
   для: Trianon   (15.06.2007 в 18:29)
 

В смысле?
Он считает для каждого подфорума по отдельности или сколько ВСЕГО сообщений на форуме?

   
 
 автор: Trianon   (15.06.2007 в 19:08)   письмо автору
 
   для: Unknown   (15.06.2007 в 18:47)
 

Для каждого по-отдельности, конечно.

Попробуйте исполнить запрос.
Сразу все поймете.

   
 
 автор: Unknown   (15.06.2007 в 19:16)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:08)
 

Как тогда на против каждого подфорума выводить количество сообщений?
Подфорумы выводится в цикле.

   
 
 автор: Trianon   (15.06.2007 в 19:27)   письмо автору
 
   для: Unknown   (15.06.2007 в 19:16)
 

<?
echo "<table><tr><td>forum</td>
    <td>themes</td><td>posts</td></tr>\r\n"
;

$sql="SELECT forums.id, forums.name, tcnt, pcnt   
 FROM forums LEFT JOIN    
  (SELECT COUNT(id) AS tcnt, fid   
  FROM topics GROUP BY  fid )    
 AS tcnt ON forums.id = tcnt.fid   
LEFT JOIN    
  (SELECT COUNT(posts.id) AS pcnt, fid   
    FROM posts   
    JOIN topics ON posts.tid = topics.id  
  GROUP BY  fid )    
 AS pcnt ON forums.id = pcnt.fid   
 ORDER BY forums.name "
;
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
while(
$row mysql_fetch_assoc($res))
{
    
$id intval($row['id']);
    
$name htmlspecialchars($row['name']);
    
$themesintval($row['tcnt']);
    
$postsintval($row['pcnt']);
    echo 
"<tr><td><a href=readforum?id=$id>$name</a></td>
    <td>
$themes</td><td>$posts</td></tr>\r\n";
}
echo 
"</table>\r\n";

   
 
 автор: Unknown   (15.06.2007 в 19:49)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:27)
 

Блин. Чето я ступил.
Спасибо.

   
 
 автор: Unkind   (15.06.2007 в 20:32)   письмо автору
 
   для: Unknown   (15.06.2007 в 13:38)
 

оличество тем я вывожу запросом
"SELECT COUNT(id) FROM `topics` WHERE fid=".$id;

А лучше COUNT(*).

А подсчет новых сообщений там реализован совсем не так.

   
 
 автор: Trianon   (15.06.2007 в 20:35)   письмо автору
 
   для: Unkind   (15.06.2007 в 20:32)
 

что-то я не заметил ни полслова в теме про новые сообщения.

новые сообщения - это вообще очень больная тема.
Хотя и решаемая.
Но и запросы и код будет посложнее.

   
 
 автор: Unkind   (15.06.2007 в 20:41)   письмо автору
 
   для: Trianon   (15.06.2007 в 20:35)
 

что-то я не заметил ни полслова в теме про новые сообщения.

Вероятно, смутило то, что автор хотел создать какое-то там поле, которое будет изменяться от добавления/удаления сообщений. К тому же почему-то показал на WEN-форум.

   
 
 автор: Unknown   (15.06.2007 в 20:49)   письмо автору
 
   для: Unkind   (15.06.2007 в 20:41)
 

Показал на WEN-форум потому, что там есть то самое, о чем я говорю - количество сообщений на против каждого подфорума. :)

   
 
 автор: Trianon   (15.06.2007 в 21:01)   письмо автору
 
   для: Unkind   (15.06.2007 в 20:41)
 

новые сообщения - это не функция от состояния форума.
Это функция от состояния форума и идентификатора посетителя.
А на этом WEN поди пойми, новые они или все.

   
 
 автор: Unknown   (15.06.2007 в 21:05)   письмо автору
 
   для: Trianon   (15.06.2007 в 21:01)
 

На WEN-форуме зарегистрированные видят новые/всего. Но мне новые не нужны, надо было просто узнать общее количество сообщений в подфоруме.

   
 
 автор: Unkind   (15.06.2007 в 21:19)   письмо автору
 
   для: Trianon   (15.06.2007 в 21:01)
 

Знаю

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования