Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

SQL для получения непрочитанных тем (topics)

Проблемы с установкой или работой phpBB 3.3.x? Получите помощь здесь!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Братцы, честно искал на форуме, но, видимо, сноровку потерял ))

Делов-то, получить SQL который понимает, что топик уже прочитан пользователем. Это стандартное поведение форума: зашел в топик и он уже считается прочитанным.
Все гуглоссылки говорят про phpbb_forums_track да только не меняется там колоночка mark_time согласно тому, что видно в интерфейсе.
Вот в какую табличку пометочка прилетает о прочтении топика, а?!
С почтением, Саша.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12430
Стаж: 12 лет 8 месяцев
Благодарил (а): 166 раз
Поблагодарили: 2478 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение Татьяна5 »

Навскидку - это всё-таки phpbb_topics_track
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Да разве я спорю?! Но тыркаю пользователем в топик, получаю в интерфейсе "прочитанность", потом иду в sql и ничего! То есть, произведённая в интерфейсе активность отсутствует в этой табличке...

select pt.*, FROM_UNIXTIME(pt.mark_time,'%d.%m.%Y %h:%i:%s')
rom phpbb_topics_track pt
where user_id = (select user_id from phpbb_users where username='user1');
С почтением, Саша.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12430
Стаж: 12 лет 8 месяцев
Благодарил (а): 166 раз
Поблагодарили: 2478 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение Татьяна5 »

"Админка - Нагрузка на сервер - Включить маркировку тем на сервере - Да"
Там так?
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Сам-то форум на данных настройках справляется же с пометками... Но раз спрашиваете, то вот, пожалуйста:
image.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
С почтением, Саша.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3336
Стаж: 15 лет 1 месяц
Благодарил (а): 25 раз
Поблагодарили: 590 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение Nekstati »

splinty,

Код: Выделить всё

SELECT t.topic_last_post_time, tt.mark_time
FROM phpbb_topics t
LEFT JOIN phpbb_topics_track tt
	ON (tt.topic_id = t.topic_id AND tt.user_id = 123)
WHERE t.topic_id = 456
 
Если topic_last_post_time > mark_time, в топике есть непрочитанные сообщения.
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Благодарю за sql, но нет, результат данного запроса не соответствует тому, что я вижу в интерфейсе phpbb3

SELECT FROM_UNIXTIME(t.topic_last_post_time,'%d.%m.%Y %h:%i:%s'), FROM_UNIXTIME(tt.mark_time,'%d.%m.%Y %h:%i:%s')
FROM phpbb_topics t
LEFT JOIN phpbb_topics_track tt ON tt.topic_id = t.topic_id AND tt.user_id = :user_id
where t.topic_last_post_time > tt.mark_time
order by 1 desc, 2 desc;


И в табличке phpbb_topics_track к сожалению не отображаются факты прочтения топика пользователем, то есть заход на линки типа phpbb3/viewtopic.php?t=128, который в самом-то интерфейсе форума отражает прочтение топика.

Отправлено спустя 10 минут 35 секунд:
Братцы, может у кого под рукой имеется sql для отрисовки собственно phpbb3/viewforum.php?f=74 ?
Оно же знает откуда-то, что прочтено?
С почтением, Саша.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение rxu »

Не совсем понял, что нужно, но можете посмотреть готовую функцию ядра на этот счет https://github.com/phpbb/phpbb/blob/81f ... 1099-L1233
Изображение
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

rxu писал(а): 28.09.2023 12:21 Не совсем понял, что нужно, но можете посмотреть готовую функцию ядра на этот счет
Поскольку я не нахожу ответа на свой изначальный вопрос о непрочитанных топиках, то в отчаянии я решил попытаться понять, какими sql сам форум этот результат отрисовывает. Ключевое слово здесь "отчаяние".
С почтением, Саша.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение rxu »

Или слушаете, но не слышите, или вообще не слушаете. Я дал ссылку, в которой есть этот самый запрос.
Если вопрос состоит в том, чтобы узнать, как это реализовано по всей базе кода ядра - то никакой одной строки, отвечающей за это, нет. Надо лопатить весь код. Но можно сделать проще - пройти по приведенной выше ссылке.
Изображение
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3336
Стаж: 15 лет 1 месяц
Благодарил (а): 25 раз
Поблагодарили: 590 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение Nekstati »

splinty писал(а): 28.09.2023 12:19 И в табличке phpbb_topics_track к сожалению не отображаются факты прочтения топика пользователем, то есть заход на линки типа phpbb3/viewtopic.php?t=128, который в самом-то интерфейсе форума отражает прочтение топика.
Факт прочтения отображается именно в этой таблице. Значение mark_time ставится не в текущее время, как вы, возможно, ожидали, а в topic_last_post_time.

Заход на указанный вами линк - это не всегда прочтение. Прочтение - это заход на последнюю страницу топика. Или по ссылке #unread.

Отправлено спустя 6 минут 37 секунд:
P.S. А если в топике 100 страниц, все они не прочитаны, юзер заходит на страницу 50 - mark_time ставится на post_time последнего поста на этой странице, тема остаётся непрочитанной, пока юзер не зайдёт на последнюю страницу. Так делается для того, чтобы можно было сгенерировать ссылку на первое непрочитанное сообщение.
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Благодаря вашему разъяснению удалось получить запрос, который отвечает на вопрос количества непрочтенных постов в НЕзакрытых (как надеюсь) топиках:

SELECT count(1) as UNREAD_COUNT
FROM phpbb_forums f
JOIN phpbb_topics t on t.forum_id=f.forum_id
LEFT JOIN phpbb_topics_track tt ON tt.topic_id = t.topic_id and tt.user_id =
(select user_id from phpbb_users t where username='???')
WHERE (t.topic_last_post_time > coalesce(tt.mark_time,t.topic_last_post_time) or tt.mark_time is null)
and t.topic_moved_id = 0 and t.topic_status=0 and f.forum_id=???
С почтением, Саша.
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Видимо ещё какой-то нюанс имеется: иногда phpbb_topics_track не заполняется при заходе пользователя в топик... Так что вышеприведённый sql показывает непрочитанный топик... Срабатывает or tt.mark_time is null
Бывает такое? Я о phpbb_topics_track
С почтением, Саша.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3336
Стаж: 15 лет 1 месяц
Благодарил (а): 25 раз
Поблагодарили: 590 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение Nekstati »

Насколько вижу, когда все топики в этом форуме прочитаны пользователем, записи из phpbb_topics_track удаляются, а метка phpbb_forums_track::mark_time обновляется. Значит, надо проверять ещё и phpbb_forums_track. Без анализа функций ядра не обойтись :)

А ещё есть phpbb_users::user_lastmark - время, когда пользователь нажал "Отметить все форумы как прочтённые".

То есть примерно так:

Код: Выделить всё

SELECT @user_id := user_id, @user_lastmark := user_lastmark
FROM phpbb_users
WHERE username = 'admin';

SELECT t.topic_id
FROM phpbb_topics t
LEFT JOIN phpbb_topics_track tt
	ON tt.topic_id = t.topic_id
	AND tt.user_id = @user_id
LEFT JOIN phpbb_forums_track ft
	ON ft.forum_id = t.forum_id
	AND ft.user_id = @user_id
WHERE (t.topic_last_post_time > GREATEST(COALESCE(tt.mark_time, 0), COALESCE(ft.mark_time, 0), @user_lastmark))
AND t.topic_moved_id = 0
AND t.topic_status = 0
AND t.forum_id = 2;
Аватара пользователя
splinty
phpBB 1.4.2
Сообщения: 55
Стаж: 13 лет 11 месяцев
Благодарил (а): 15 раз

Re: SQL для получения непрочитанных тем (topics)

Сообщение splinty »

Программист программисту - друг, помощник и мануал! Благодарю сердечно! Похоже, задача решена! Проверяю на проме!
С почтением, Саша.

Вернуться в «Поддержка phpBB 3.3.x»