Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите составить запрос, чтобы посчитать все сообщения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: MySQL
Heavenanvil
Отправлено: 16 Ноября, 2016 - 10:22:01
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Здравствуйте, уважаемые.

Лирика: На форуме нет возможности автоматически пересчитать все сообщения и количество тем. После нескольких манипуляций кривыми ручками счетчик безнадежно сбился и посчитать всё вручную не представляется возможным.

Суть: Попробовал написать php-файлик с запросами к БД MySQL, чтобы пересчитать все темы и сообщения, но столкнулся с некоторыми проблемами.

Проблема:
CODE (PHP):
скопировать код в буфер обмена
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <META content="text/html; charset=utf-8" http-equiv="Content-Type">
  5. </head>
  6. <body>
  7. <?php
  8. mysql_connect("****", "****", "****");
  9. mysql_query  ("set_client='utf8'");
  10. mysql_query  ("set character_set_results='utf8'");
  11. mysql_query  ("set collation_connection='utf8_general_ci'");
  12. mysql_query  ("SET NAMES utf8");
  13.  
  14. //Для примера возьмём раздел форума имеющий id = 27:
  15. $forum_id = 27;
  16.  
  17. //Считаем количество тем в разделе "27", которые утверждены:
  18. $sql1 = "SELECT COUNT(*) FROM `forums_topics` WHERE `forum_id` = '$forum_id' AND `approved` = '1'";
  19. $request1 = mysql_query($sql1) or die(mysql_error());
  20. $result1 = mysql_fetch_array($request1);
  21. $resultat1 = $result1[0];
  22.  
  23. //Записываем количество тем в разделе, которое нашли выше:
  24. $sql2 = "UPDATE `forums_forums` SET `topics` = $resultat1 WHERE `id` = '$forum_id'";
  25. $result2 = mysql_query($sql2) or die(mysql_error());
  26.  
  27. //Находим ID тем, которые созданы в разделе "27":
  28. $sql3 = "SELECT `tid` FROM `forums_topics` WHERE `forum_id`= '$forum_id'";
  29. $request3 = mysql_query($sql3) or die(mysql_error());
  30. $result3 = mysql_fetch_array($request3);
  31. $resultat3 = $result3[0];
  32.  
  33. //var_dump($resultat3);
  34. //должен выдавать "150, 1434, 17200", но выдает только "150", а $result3[1] выдаст NULL.
  35.  
  36. //Считаем количество сообщений во всех темах раздела "27", которые утверждены.
  37. //Но запрос не правильный. Он должен считать из всех тем, а считает только из одной.
  38. //Нужно использовать какой-то цикл, но "$resultat3" содержит лишь одно значение.
  39. $sql4 = "SELECT COUNT(*) FROM `forums_posts` WHERE `topic_id` = '$resultat3' AND `queued` = '0'";
  40. $request4 = mysql_query($sql4) or die(mysql_error());
  41. $result4 = mysql_fetch_array($request4);
  42. $resultat4 = $result4[0];
  43.  
  44. echo "Количество тем в разделе ". $forum_id .": <strong>". $resultat1 ."</strong><br />";
  45. echo "ID темы, которые созданы в разделе ". $forum_id .": <strong>". $resultat3 ."</strong><br />";
  46. echo "Количество сообщений в разделе ". $forum_id .": <strong>". $resultat4 ."</strong><br />";
  47. ?>
  48. </body>
  49. </html>

Может кто помочь мне пересчитать все темы и сообщения?
Кроме того, хотелось бы, чтобы $forum_id не указывался вручную, а автоматически по всем разделам пробежался.
p.s. форум конечно же не на этом движке

(Отредактировано автором: 16 Ноября, 2016 - 10:24:29)

 
 Top
Джур
Отправлено: 16 Ноября, 2016 - 13:31:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007  


Помог: 0 раз(а)




У меня не ответ, но брюзжание...

Хм Писать запрос на основе других запросов и своих догадок? Это надо в раздел кроссвордов разместить. Если форум не самописный, могли бы хотя бы название сказать, раз уж не даете структуры таблиц.

(Отредактировано автором: 16 Ноября, 2016 - 13:32:01)



-----
Тамбовский каджит тебе товарищ
 
 Top
Heavenanvil
Отправлено: 16 Ноября, 2016 - 15:11:16
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Джур, движок IPB4, он же IPS Community Suite 4.

Структура таблиц примерно такая:

Таблица forums_forums, содержит информацию о разделах форума.
Поля:
id - айди раздела, соответственно;
topics - количество тем в разделе;
posts - количество сообщений в разделе;
остальные поля не интересны.

Таблица forums_topics, содержит информацию о темах форума.
Поля:
tid - айди темы;
posts - количество сообщений в теме;
forum_id - раздел, в котором создана тема. Вроде должен быть равен forums_forums.id ;
approved - статус темы. Значение 1 - утверждена, 0/-1 - не утверждена/скрыта;
остальные поля не интересны.

Таблица forums_posts, содержит информацию о сообщениях темы.
pid - айди сообщения;
topic_id - тема, в которой написано это сообщение. Вроде должен быть равен forums_topics.tid;
queued - статус сообщения. Значение 1 - скрыто, 0 - не скрыто (утверждено);
остальные поля не интересны.

Надеюсь этого должно хватить
 
 Top
Мелкий Супермодератор
Отправлено: 16 Ноября, 2016 - 15:48:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_topics LEFT JOIN (
  2.     SELECT topic_id, count(0) AS messages_cnt
  3.     FROM forums_posts WHERE queued=0
  4.     GROUP BY topic_id
  5. ) msg_cnt ON topic_id = forums_topics.id
  6. SET posts = coalesce(messages_cnt, 0);
  7.  
  8. UPDATE forums_forums LEFT JOIN (
  9.     SELECT forum_id, count(0) AS topics_cnt, sum(posts) AS msg_cnt
  10.     FROM forums_topics WHERE approved = 1
  11.     GROUP BY forum_id
  12. ) msg_cnt ON forum_id = forums_forums.id
  13. SET topics = coalesce(topics_cnt, 0),
  14.     posts = coalesce(msg_cnt, 0)


-----
PostgreSQL DBA
 
 Top
Heavenanvil
Отправлено: 17 Ноября, 2016 - 03:27:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Мелкий,
Всё работает, только вместо forums_topics.id нужно было forums_topics.tid.
Спасибо.

(Отредактировано автором: 17 Ноября, 2016 - 06:30:32)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB