SQL для получения непрочитанных тем (topics)
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение

-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
SQL для получения непрочитанных тем (topics)
Братцы, честно искал на форуме, но, видимо, сноровку потерял ))
Делов-то, получить SQL который понимает, что топик уже прочитан пользователем. Это стандартное поведение форума: зашел в топик и он уже считается прочитанным.
Все гуглоссылки говорят про phpbb_forums_track да только не меняется там колоночка mark_time согласно тому, что видно в интерфейсе.
Вот в какую табличку пометочка прилетает о прочтении топика, а?!
Делов-то, получить SQL который понимает, что топик уже прочитан пользователем. Это стандартное поведение форума: зашел в топик и он уже считается прочитанным.
Все гуглоссылки говорят про phpbb_forums_track да только не меняется там колоночка mark_time согласно тому, что видно в интерфейсе.
Вот в какую табличку пометочка прилетает о прочтении топика, а?!
С почтением, Саша.
-
- Поддержка
- Сообщения: 12751
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Да разве я спорю?! Но тыркаю пользователем в топик, получаю в интерфейсе "прочитанность", потом иду в 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');
С почтением, Саша.
-
- Поддержка
- Сообщения: 12751
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: SQL для получения непрочитанных тем (topics)
"Админка - Нагрузка на сервер - Включить маркировку тем на сервере - Да"
Там так?
Там так?
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Сам-то форум на данных настройках справляется же с пометками... Но раз спрашиваете, то вот, пожалуйста:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
С почтением, Саша.
-
- Поддержка
- Сообщения: 3336
- Стаж: 16 лет 1 месяц
- Благодарил (а): 17 раз
- Поблагодарили: 561 раз
Re: SQL для получения непрочитанных тем (topics)
splinty,
Если topic_last_post_time > mark_time, в топике есть непрочитанные сообщения.
Код: Выделить всё
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, в топике есть непрочитанные сообщения.
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Благодарю за sql, но нет, результат данного запроса не соответствует тому, что я вижу в интерфейсе phpbb3
И в табличке phpbb_topics_track к сожалению не отображаются факты прочтения топика пользователем, то есть заход на линки типа phpbb3/viewtopic.php?t=128, который в самом-то интерфейсе форума отражает прочтение топика.
Отправлено спустя 10 минут 35 секунд:
Братцы, может у кого под рукой имеется sql для отрисовки собственно phpbb3/viewforum.php?f=74 ?
Оно же знает откуда-то, что прочтено?
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 ?
Оно же знает откуда-то, что прочтено?
С почтением, Саша.
-
- phpBB Guru
- Сообщения: 16947
- Стаж: 18 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 549 раз
- Поблагодарили: 1700 раз
Re: SQL для получения непрочитанных тем (topics)
Не совсем понял, что нужно, но можете посмотреть готовую функцию ядра на этот счет https://github.com/phpbb/phpbb/blob/81f ... 1099-L1233
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Поскольку я не нахожу ответа на свой изначальный вопрос о непрочитанных топиках, то в отчаянии я решил попытаться понять, какими sql сам форум этот результат отрисовывает. Ключевое слово здесь "отчаяние".rxu писал(а): 28.09.2023 12:21 Не совсем понял, что нужно, но можете посмотреть готовую функцию ядра на этот счет
С почтением, Саша.
-
- phpBB Guru
- Сообщения: 16947
- Стаж: 18 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 549 раз
- Поблагодарили: 1700 раз
Re: SQL для получения непрочитанных тем (topics)
Или слушаете, но не слышите, или вообще не слушаете. Я дал ссылку, в которой есть этот самый запрос.
Если вопрос состоит в том, чтобы узнать, как это реализовано по всей базе кода ядра - то никакой одной строки, отвечающей за это, нет. Надо лопатить весь код. Но можно сделать проще - пройти по приведенной выше ссылке.
Если вопрос состоит в том, чтобы узнать, как это реализовано по всей базе кода ядра - то никакой одной строки, отвечающей за это, нет. Надо лопатить весь код. Но можно сделать проще - пройти по приведенной выше ссылке.
-
- Поддержка
- Сообщения: 3336
- Стаж: 16 лет 1 месяц
- Благодарил (а): 17 раз
- Поблагодарили: 561 раз
Re: SQL для получения непрочитанных тем (topics)
Факт прочтения отображается именно в этой таблице. Значение mark_time ставится не в текущее время, как вы, возможно, ожидали, а в topic_last_post_time.splinty писал(а): 28.09.2023 12:19 И в табличке phpbb_topics_track к сожалению не отображаются факты прочтения топика пользователем, то есть заход на линки типа phpbb3/viewtopic.php?t=128, который в самом-то интерфейсе форума отражает прочтение топика.
Заход на указанный вами линк - это не всегда прочтение. Прочтение - это заход на последнюю страницу топика. Или по ссылке #unread.
Отправлено спустя 6 минут 37 секунд:
P.S. А если в топике 100 страниц, все они не прочитаны, юзер заходит на страницу 50 - mark_time ставится на post_time последнего поста на этой странице, тема остаётся непрочитанной, пока юзер не зайдёт на последнюю страницу. Так делается для того, чтобы можно было сгенерировать ссылку на первое непрочитанное сообщение.
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Благодаря вашему разъяснению удалось получить запрос, который отвечает на вопрос количества непрочтенных постов в НЕзакрытых (как надеюсь) топиках:
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=???
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=???
С почтением, Саша.
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Видимо ещё какой-то нюанс имеется: иногда phpbb_topics_track не заполняется при заходе пользователя в топик... Так что вышеприведённый sql показывает непрочитанный топик... Срабатывает or tt.mark_time is null
Бывает такое? Я о phpbb_topics_track
Бывает такое? Я о phpbb_topics_track
С почтением, Саша.
-
- Поддержка
- Сообщения: 3336
- Стаж: 16 лет 1 месяц
- Благодарил (а): 17 раз
- Поблагодарили: 561 раз
Re: SQL для получения непрочитанных тем (topics)
Насколько вижу, когда все топики в этом форуме прочитаны пользователем, записи из phpbb_topics_track удаляются, а метка phpbb_forums_track::mark_time обновляется. Значит, надо проверять ещё и phpbb_forums_track. Без анализа функций ядра не обойтись :)
А ещё есть phpbb_users::user_lastmark - время, когда пользователь нажал "Отметить все форумы как прочтённые".
То есть примерно так:
А ещё есть 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;
-
- phpBB 1.4.2
- Сообщения: 65
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 23 раза
Re: SQL для получения непрочитанных тем (topics)
Программист программисту - друг, помощник и мануал! Благодарю сердечно! Похоже, задача решена! Проверяю на проме!
С почтением, Саша.