Пересчет тем и сообщений в IPS 4 - Страница 2 - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

sql запросы

  • 2 Страниц +
  • 1
  • 2

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

#16 Пользователь на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 119
  • Регистрация: 20-Март 09
  • Репутация: 2 445
  • IPB version:3.1.x
 

Отправлено 20 Ноябрь 2018 - 20:13

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

#17 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 591
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 403
  • IPB version:I have no IPB
 

Отправлено 21 Ноябрь 2018 - 14:21

Сделайте по уму. Используйте апи http://ipbskins.ru/f...topic14284.html
Данных, смотрю, на обновление не так много (30 тем)
Создайте в корне форума файл.
0

#18 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 24 Ноябрь 2018 - 15:49

Вы так и не поняли, мне не нужно чтобы форум делал все сам, он не обновляет счётчики тем, что даты что авторов, если я работаю через 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 (24 Ноябрь 2018 - 15:52)

0

#19 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 24 Ноябрь 2018 - 17:11

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

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


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

#20 Пользователь на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 119
  • Регистрация: 20-Март 09
  • Репутация: 2 445
  • IPB version:3.1.x
 

Отправлено 24 Ноябрь 2018 - 21:52

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

#21 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 25 Ноябрь 2018 - 00:16

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

1. Запросить ид темы, которые соотвествуют условию. Это я написал в посту #18 в третьем коде
2. Одобрить сообщения - Это я написал в посту #18 в четвером коде
3. потом зная ид затронутых тем - Просил в этом помочь в посту #18 Я знаю как сохранить а как выгрузить их, чтобы ими пользоваться, пока не понял, может PHP поможет.
4. обновить статистику темы. - Помогите еще вот с этим, если есть наработки, могу описать ТЗ детально, сейчас этим и занимаюсь, готов за $

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

#22 Пользователь на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 119
  • Регистрация: 20-Март 09
  • Репутация: 2 445
  • IPB version:3.1.x
 

Отправлено 25 Ноябрь 2018 - 01:29

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

#23 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 25 Ноябрь 2018 - 04:07

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

0

#24 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 25 Ноябрь 2018 - 04:10

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

Я не знаю как работает API, но если выгружать посты и темы из одной БД в другую, там тоже базы не будут обновляться.
Через PHP думаю сделать, сначала экспорт id тем делаю на сервер, потом php вставляет их в запрос MySQL.

Сообщение изменено: tunofak (25 Ноябрь 2018 - 04:11)

0

#25 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 591
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 403
  • IPB version:I have no IPB
 

Отправлено 25 Ноябрь 2018 - 10:45

<?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) {}
	}
}

1

#26 Пользователь не на сайте   tunofak ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 79
  • Регистрация: 11-Март 16
  • Репутация: 0
  • IPB version:3.4.x
 

Отправлено 25 Ноябрь 2018 - 12:13

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

У меня выходит ошибка, но это из за кривоватости моей БД, но все равно работает все ОК.
Ошибка может возникать
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}

0

#27 Пользователь на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 119
  • Регистрация: 20-Март 09
  • Репутация: 2 445
  • IPB version:3.1.x
 

Отправлено 25 Ноябрь 2018 - 12:19

'"post_date ASC'

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

Сообщить об этой теме:


  • 2 Страниц +
  • 1
  • 2


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2018 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна