|
|
|
| Не секрет, что на форуме используется аддитивная система подсчета сообщений, т.е. после добавления сообщения в таблице авторов увеличивается на единицу поле themes, которое и выводится в списке авторов. Темы скрываются или удаляются, а значение themes не корректируется. Я решил подсчитать реальное количество сообщений посетителей форума и скорректировать эти значения. Тем более задача мне показалась интересной в силу того, что форум имеет архивную и активную таблицу с сообщениями.
В первую очередь я удалил скрытые темы и их сообщения, после чего удалил все скрытые сообщения (из активной и архивной таблицы). Пересчет сообщений для всех пользователей задача достаточно объемная и была тут же заблокирована хостером. Поэтому я решил ограничиться первыми 100 наиболее активными участниками. Ниже представлен SQL-запрос, который пересчитывает количества сообщений по обеим таблицам форума
SELECT
ath.name,
cnt.total,
arh.total,
(IFNULL(cnt.total,0) + IFNULL(arh.total,0)) AS summ
FROM
(SELECT * FROM authors ORDER BY themes DESC LIMIT 100) AS ath
LEFT JOIN (
SELECT id_author, COUNT(posts.id_author ) AS total
FROM posts
WHERE posts.hide = 'show'
GROUP BY posts.id_author
ORDER BY posts.id_author
) AS cnt ON ( ath.id_author = cnt.id_author )
LEFT JOIN (
SELECT id_author, COUNT(archive_posts.id_author ) AS total
FROM archive_posts
WHERE archive_posts.hide = 'show'
GROUP BY archive_posts.id_author
ORDER BY archive_posts.id_author
) AS arh ON( ath.id_author = arh.id_author )
ORDER BY summ DESC ;
| После чего не составило труда составить UPDATE-запрос
UPDATE
(SELECT * FROM authors ORDER BY themes DESC LIMIT 100) AS ath
LEFT JOIN authors
ON (authors.id_author = ath.id_author)
LEFT JOIN (
SELECT id_author, COUNT(posts.id_author ) AS total
FROM posts
WHERE posts.hide = 'show'
GROUP BY posts.id_author
ORDER BY posts.id_author
) AS cnt ON ( ath.id_author = cnt.id_author )
LEFT JOIN (
SELECT id_author, COUNT(archive_posts.id_author ) AS total
FROM archive_posts
WHERE archive_posts.hide = 'show'
GROUP BY archive_posts.id_author
ORDER BY archive_posts.id_author
) AS arh ON( ath.id_author = arh.id_author )
SET authors.themes = (IFNULL(cnt.total,0) + IFNULL(arh.total,0))
WHERE authors.id_author = ath.id_author;
|
| |
|
|
|
|
|
|
|
для: cheops
(18.03.2011 в 19:16)
| | мертвые души :)
А нельзя в информацию о пользователе добавить дату регистрации?
Память у меня не очень, а ужасно интересно сколько я тут уже ошиваюсь на форуме.
Ну или хотябы послать меня по почте, а я себе на дереве зарубки сделаю :) | |
|
|
|
|
|
|
|
для: Valick
(18.03.2011 в 19:40)
| | >А нельзя в информацию о пользователе добавить дату регистрации?
Да нужно будет заняться.
>Память у меня не очень, а ужасно интересно сколько я тут уже ошиваюсь на форуме.
>Ну или хотябы послать меня по почте, а я себе на дереве зарубки сделаю :)
База данных говорит, что первое ваше сообщение сообщение было в теме http://softtime.ru/forum/read.php?id_forum=1&id_theme=54037. | |
|
|
|
|
|
|
|
для: cheops
(18.03.2011 в 19:52)
| | Ух, спасибо, аж накрыло слегка приступом ностальгии. Вспоминаю то время когда до дыр зачитывал книги по РНР. | |
|
|
|