Удаление постов удаленных пользователей

Удаление постов удаленных пользователей

от Kit Poli -
Количество ответов: 9

Добрый день!

У меня какая-то странная ситуация, очень нужна помощь. 

Есть moodle 1.9, в свое время весьма заспамленный. В нем были (похоже) вручную удалены аккаунты ботов, но остались сообщения сделанные ими в самых разных форумах. 

Подскажите, пожалуйста, можно ли удалить сообщения удаленных пользователей? База раздута до безумных размеров, очень хочется ее уменьшить...

В ответ на Kit Poli

Re: Удаление постов удаленных пользователей

от Vadim Tabunshchik -
Изображение пользователя Developers

можно ли удалить сообщения удаленных пользователей?

Нужно, тем более, что это боты.

В ответ на Vadim Tabunshchik

Re: Удаление постов удаленных пользователей

от Kit Poli -

Вопрос в том, как это сделать "оптом". Насколько я понимаю, встроенного в мудл подобного механизма нет. Пытался придумать маску для запроса из базы данных, но тоже ничего не получилось.

Очень нужна консультация умного человека

В ответ на Kit Poli

Re: Удаление постов удаленных пользователей

от Vadim Tabunshchik -
Изображение пользователя Developers

Что, так много наспамили, что нужно это сделать "оптом"?

Прикинусь умным улыбаюсь Удаляйте запросом к БД. Я думаю, боты не настолько продвинутые, чтоб новые форумы и новые темы обсуждений создать? Тогда нужно почистить только таблицу _forum_posts.

Если учетки ботов удалялись через интерфейс Moodle, то в базе их записи остались, только флаг поставлен deleted=1. Вот и нужно найти все посты удаленных ботов в _forum_posts:

SELECT *
FROM mdl_forum_posts fp
LEFT JOIN
mdl_user u ON fp.userid=u.id
WHERE
u.deleted = 1 OR fp.userid NOT IN (SELECT u.id FROM mdl_user u)

Второе условие (после  OR), на всякий случай,- ищет посты несуществующих пользователей, вдруг ботов напрямую в БД удаляли.

Проверяете, потом удаляете

Аналогично поищите записи в таблицах mdl_forum и mdl_forum_discussions, хотя это вряд ли, тогда у ботов права преподавателя должны быть.

В ответ на Vadim Tabunshchik

Re: Удаление постов удаленных пользователей

от Kit Poli -

Спасибо Вам большое! Это именно то что нужно.  Вы меня просто спасли

/*пойду учиться работать с базами данных чтобы не задавать глупых вопросов*/

 

В ответ на Vadim Tabunshchik

Re: Удаление постов удаленных пользователей

от Kit Poli -

А вот можно совсем обнаглеть?

Выборка получилась отличная, но вот как все удалить... Потратил на перебор вариантов часов 6, но ничего путного не получается. 

Последний вариант выглядел вот так:

DELETE FROM post WHERE (
SELECT *
FROM post fp
LEFT JOIN
user u ON fp.userid=u.id
WHERE
fp.userid NOT IN (SELECT u.id FROM user u)
)

Возвращается "#1241 - Operand should contain 1 column(s)"

Я понимаю что наглость, понимаю что оффтоп, но очень нужно;)

В ответ на Kit Poli

Re: Удаление постов удаленных пользователей

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle

после "DELETE FROM post WHERE" должно быть условие а не содержимое.

Пример

DELETE FROM post WHERE id in ( select id FROM post fp
LEFT JOIN
user u ON fp.userid=u.id
WHERE
fp.userid NOT IN (SELECT u.id FROM user u)
)

для отладки сначала можно посмотреть что возвращает запрос

select id FROM post fp
LEFT JOIN user u ON fp.userid=u.id WHERE fp.userid NOT IN (SELECT u.id FROM user u)

В ответ на Виталий Лавров

Re: Удаление постов удаленных пользователей

от Kit Poli -

Теперь пишет "#1052 - Column 'id' in field list is ambiguous"

Запрос с select в таком виде тоже выдает "#1052 - Column 'id' in field list is ambiguous", если заменить "select id" на "select *" то выдает то что нужно...

В ответ на Kit Poli

Re: Удаление постов удаленных пользователей

от Vadim Tabunshchik -
Изображение пользователя Developers

Ну правильно пишет: "Поле 'id' не однозначно", нужно явно указать к какому столбцу обращаться. Учите матчасть, пригодится. улыбаюсь

Если работаете в phpMyAdmin, то достаточно немного изменить запрос: вместо выбора ВСЕХ полей, выбрать только id записей. Тогда их можно будет отметить галкой и удалить:

SELECT fp.id
FROM mdl_forum_posts fp
LEFT JOIN
mdl_user u ON fp.userid=u.id
WHERE u.deleted = 1 OR fp.userid NOT IN (SELECT u.id FROM mdl_user u)

В ответ на Vadim Tabunshchik

Re: Удаление постов удаленных пользователей

от Kit Poli -

Спасибо всем большое. Последний рецепт помог. Проблема вроде решена.

Пойду учить мат.часть... (действительно давно пора)