Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
avtobus

Пересчет тем и сообщений в IPS 4

Рекомендованные сообщения

Если речь идет о статистике блока "Темы" нужно смотреть откуда он берет информацию. Мои запросы обновляют только количество сообщений/тем форумов и пользователей. Я не помню как происходит обновление статистики темы, но думаю что это пост с последним post_date этой темы. Соответственно его автор ид, имя и тп. Аналогично это касается и форумов. Но пересчитывать статистику десятков тысяч тем ради несколько это нонсенс. Запросы увы не напишу, давно не открывал ипб.

Поделиться сообщением


Ссылка на сообщение

Сделайте по уму. Используйте апи http://ipbskins.ru/forum/topic14284.html

Данных, смотрю, на обновление не так много (30 тем)

Создайте в корне форума файл.

Поделиться сообщением


Ссылка на сообщение
11/24/18 12:50 (изменено)

Вы так и не поняли, мне не нужно чтобы форум делал все сам, он не обновляет счётчики тем, что даты что авторов, если я работаю через SQL запросы.

 

HELP!!

UPDATE forums_topics t 
LEFT JOIN( SELECT topic_id, COUNT(*) as posts FROM forums_posts WHERE queued=0 GROUP BY topic_id ) z ON z.topic_id=t.tid 
SET t.posts=IFNULL(z.posts, 0);

Как разделить этот запрос?

например по

WHERE `forums_topics`.`tid` = (id темы)
WHERE `forums_forums`.`id` = (id форума)

 

Я что придумал.

 

Это поиск тем в которых есть скрытые сообщения и экспорт их в файл на сервере.

SELECT topic_id FROM `forums_posts`
WHERE `forums_posts`.`queued` = -1
GROUP BY topic_id
INTO OUTFILE '/111.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' LINES 
TERMINATED BY '\n'

 

Потом, все темы/сообщения от СЕГОДНЯ из скрытых, открываем.

UPDATE `forums_posts`
SET `queued` = 0
WHERE `post_date` < UNIX_TIMESTAMP();

UPDATE `forums_topics`
SET `approved` = 1 
WHERE `start_date` < UNIX_TIMESTAMP();

 

Следующее, что я не решил, это как значения в файле 111.csv , импортировать в строку MySQL запроса.

Например

forum_topics.tid = (import /111.csv)

 

И далее так же что не решил, о чем писал выше, чтобы выглядело примерно так:

UPDATE forums_topics t 
LEFT JOIN( SELECT topic_id, COUNT(*) as posts FROM forums_posts WHERE queued=0 GROUP BY topic_id ) z ON z.topic_id=t.tid 
SET t.posts=IFNULL(z.posts, 0)
WHERE forum_topics.tid = (import /111.csv);

Изменено пользователем tunofak

Поделиться сообщением


Ссылка на сообщение

Пересчет сообщений в темах:

 

UPDATE forums_topics t 
LEFT JOIN( SELECT topic_id, COUNT(*) as posts FROM forums_posts WHERE queued=0 GROUP BY topic_id ) z ON z.topic_id=t.tid 
SET t.posts=IFNULL(z.posts, 0);

 

Пересчет тем и сообщений в форумах:

 

UPDATE forums_forums f 
LEFT JOIN ( SELECT forum_id, COUNT(*) as topics, SUM(posts) as posts FROM forums_topics GROUP BY forum_id ) z ON z.forum_id=f.id 
SET f.topics=IFNULL(z.topics, 0), f.posts=IFNULL(z.posts, 0);

 

А данные запросы вообще обновляют информацию о последнем сообщении/темы?

Поделиться сообщением


Ссылка на сообщение

Так мы об этом и говорим, что эти запросы не обновляют статистику последних сообщений тем. Они только пересчитывают счетчик сообщений и все. Проблема в том, что обновлять статистику темы из sql запросов довольно сложно. А делать это для всех тем на огромном форуме будет просто дичь. Тут сначала нужно запросить ид тем которые соответсвуют условию. Одобрить сообщения, потом зная ид затронутых тем обновить статистику темы. И даже так, из sql запроса это сделать не просто, так как нужно получить последний пост и обновить из этих данных поля темы, и желательно форумов тоже. В любом случае, без php тут сложно обойтись. А еще лучше сделать это через апи. Да, возможно будет чуть больше нагрузка, но если это делать только по айди ничего страшного не будет.

Может быть это можно сделать и запросами, но у меня при составление такие монстры получались, что я вообще сомневаюсь что они будут в принципе работать. Очень спецефично составлять запросы когда дело касается сортировки и отбора одной записи. Увы, моего скила по sql тут не достаточно.

Поделиться сообщением


Ссылка на сообщение

Вы сказали - Тут сначала нужно запросить ид тем которые соответсвуют условию. Одобрить сообщения, потом зная ид затронутых тем обновить статистику темы.

 

1. Запросить ид темы, которые соотвествуют условию. Это я написал в посту #18 в третьем коде

2. Одобрить сообщения - Это я написал в посту #18 в четвером коде

3. потом зная ид затронутых тем - Просил в этом помочь в посту #18 Я знаю как сохранить а как выгрузить их, чтобы ими пользоваться, пока не понял, может PHP поможет.

4. обновить статистику темы. - Помогите еще вот с этим, если есть наработки, могу описать ТЗ детально, сейчас этим и занимаюсь, готов за $

 

Систему грузить не особо много будет т.к. всё будет в Cron и поэтапно как здесь написано.

Поделиться сообщением


Ссылка на сообщение

Почти. Только условие селекта должно точно совпадать с условием апдейта. Выгружать список в файл не имеет смысла, все равно им потом трудно будет воспользоватся из mysql. Тогда уж лучше рещультат в переменную записать.

Проще всего это реализовать через php используя api. Дальнейшее ковыряние в сторону sql запросов по обновлянию статы будут корявые костыли. Будет время посмотрю что там с апи можно сделать.

А может вообще лучше пересмотреть логику отложенных публикации. Например, создать отдельно базу постов и тем а с помощью апи по крону их запостить.

Поделиться сообщением


Ссылка на сообщение

В общем только на forums_topics

Есть 4 значения которых нужно менять.

`last_poster_id` - Последний автор темы (ID)

`last_post` - Последняя дата сообщения в теме(UNIX)

`last_poster_name` - Последний автор темы(Название)

`last_real_post` - Последняя дата сообщения в теме(UNIX)

 

Вот накатал обновление только по `last_post` - Последняя дата сообщения в теме(UNIX) И тут появились ошибки, не поможете?

 

UPDATE `forums_topics` = `t`
LEFT JOIN (SELECT * FROM `forums_posts` WHERE `queued` = 0) = `x`
LEFT JOIN (SELECT `post_date` FROM `x` WHERE `x`.`post_date` = (SELECT MAX(`x`.`post_date`)) FROM `x`))= `z` ON `z`.`topic_id`=`t`.`tid`
SET `z` = `t`.`last_post`
WHERE `t`.`approved` = 1

Поделиться сообщением


Ссылка на сообщение
11/25/18 01:11 (изменено)

Я то в SQL не какой) а вы еще про API

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

 

Я не знаю как работает API, но если выгружать посты и темы из одной БД в другую, там тоже базы не будут обновляться.

Через PHP думаю сделать, сначала экспорт id тем делаю на сервер, потом php вставляет их в запрос MySQL.

Изменено пользователем tunofak

Поделиться сообщением


Ссылка на сообщение
<?php

require_once('init.php');
\IPS\Dispatcher\External::i();

// Редиректим на главную страница, если ID юзера не равно 1
if (\IPS\Member::loggedIn()->member_id != 1)
{
\IPS\Output::i()->redirect(\IPS\Http\Url::internal(''));
}

$hiddenTids = array();

// Скрываем посты, дата публикации которых больше текущей
foreach (new \IPS\Patterns\ActiveRecordIterator(\IPS\Db::i()->select('*', 'forums_posts', array(array('post_date>?', time())), 'post_date ASC'), 'IPS\forums\Topic\Post') as $post)
{
$tid = $post->mapped('item');
$first = $post->mapped('first');

// Стартовый пост. Скрываем всю тему
if ($first)
{
	$hiddenTids[$tid] = $tid;

	try
	{
		$post->item()->hide(false);
	}
	catch (\Exception $e){}
}
// Не стартовый пост и не входит в список выше скрытых тем
elseif (!$first and !isset($hiddenTids[$tid]))
{
	try
	{
		$post->hide(false);
	}
	catch (\Exception $e) {}
}
}

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Скрипт работает! Прям вы выручаете в трудной ситуации, готов отблагодарить!

 

У меня выходит ошибка, но это из за кривоватости моей БД, но все равно работает все ОК.

Ошибка может возникать

1. Есть скрытые темы, сообщения в которых дата, меньше чем сегодня.

2. Есть открытые темы из будущего (2019 год и т д)

 

К сожалению, возникла проблема

 

Что-то пошло не так. Пожалуйста, попробуйте еще раз.

Код ошибки: EX1064

SELECT * FROM `forums_posts` WHERE post_date>1543133405 ORDER BY "post_date ASC
IPS\Db\Exception: 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 '"post_date ASC' at line 1 (1064)
#0 /var/www/hackcard.pw/data/www/webria/system/Db/Select.php(378): IPS\_Db->preparedQuery('SELECT * FROM `...', Array, true)
#1 /var/www/hackcard.pw/data/www/webria/system/Db/Select.php(440): IPS\Db\_Select->runQuery()
#2 [internal function]: IPS\Db\_Select->rewind()
#3 /var/www/hackcard.pw/data/www/webria/data.php(15): IteratorIterator->rewind()
#4 {main}

Поделиться сообщением


Ссылка на сообщение

'"post_date ASC'

Тут лишняя кавычка. Уберите двойную.

Пост исправил.

Поделиться сообщением


Ссылка на сообщение

Поднимаю тему. Вопросы по доработке скрипта.

Для тех кто не в теме:

Сообщения + темы скрыты, они из будущего. Например сообщения/темы с датой из 2020 года скрыты. SQL командой сообщения/темы я перевожу из скрытых в открытые, но те у которых дата до настоящего времени. То есть сегодня 17 июня, даты от 18 июня они скрыты, завтра я опять выполню SQL команду и у меня откроются посты от 18 июня. Но нужна была такая команда, которая обновляет информацию о последнем сообщении/теме справа в блоках просмотра тем. Команда есть в 3х версии в 4х нету. Был поиск решения, остановились на одном на скрипте.

 

Вопрос следующий, проблемы в этом скрипте на php, как были так и остались. Его приходится запускать по 1000 раз, и не всегда он обновляет информацию. Например из 1000 тем, в которых появилось новое сообщение, обновляет информацию только в 100-100 темах. Как решить HELP, ОТБЛАГОДАРЮ ПЛАТНО.

 

 

Скрипт работает! Прям вы выручаете в трудной ситуации, готов отблагодарить!У меня выходит ошибка, но это из за кривоватости моей БД, но все равно работает все ОК.Ошибка может возникать1. Есть скрытые темы, сообщения в которых дата, меньше чем сегодня.2. Есть открытые темы из будущего (2019 год и т д)К сожалению, возникла проблемаЧто-то пошло не так. Пожалуйста, попробуйте еще раз.Код ошибки: EX1064

SELECT * FROM `forums_posts` WHERE post_date>1543133405 ORDER BY "post_date ASCIPS\Db\Exception: 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 '"post_date ASC' at line 1 (1064)#0 /var/www/hackcard.pw/data/www/webria/system/Db/Select.php(378): IPS\_Db->preparedQuery('SELECT * FROM `...', Array, true)#1 /var/www/hackcard.pw/data/www/webria/system/Db/Select.php(440): IPS\Db\_Select->runQuery()#2 [internal function]: IPS\Db\_Select->rewind()#3 /var/www/hackcard.pw/data/www/webria/data.php(15): IteratorIterator->rewind()#4 {main}

Поделиться сообщением


Ссылка на сообщение

Скрипт из 25 поста скрывает темы/посты с будущими датами. Он не делает обратного.

Зачем его запускать 1000 раз, если можно использовать крон.

Поделиться сообщением


Ссылка на сообщение
17.06.2019 в 12:30, newbie сказал:

Скрипт из 25 поста скрывает темы/посты с будущими датами. Он не делает обратного.

Зачем его запускать 1000 раз, если можно использовать крон.

приветствую! А как быть со статистикой (счетчиками) файлов в определенной категории? Есть ли подобный способ. А то везде нули показывает, захожу в категорию , а файлы в ней есть. Это только в боковом блоке категорий на главной странице файлов, а также зайдя в категорию. Заранее благодарю

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...