Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
avtobus

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by tunofak

Share this post


Link to post
Share on other sites

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

 

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);

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

В общем только на 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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Edited by tunofak

Share this post


Link to post
Share on other sites
<?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

Share this post


Link to post
Share on other sites

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

 

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

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

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}

Share this post


Link to post
Share on other sites

'"post_date ASC'

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

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

Share this post


Link to post
Share on other sites

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

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

Сообщения + темы скрыты, они из будущего. Например сообщения/темы с датой из 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}

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...