Помогите построить SQL запрос

Главные вкладки

Комментарии

Аватар пользователя smallredstone smallredstone 2 июля 2012 в 18:48

Модуль комментариев дает как минимум четыре новых таблицы (comment, field_data_comment_body, field_revision_comment_body, node_comment_statistics) и возможно в других следит.
Поэтому вряд-ли кто решится SQL составлять.

Зато в файле comment.module есть функция comment_delete_multiple — на вашем месте я бы попытался бы ее как нибудь вызвать, например через небольшой самописный модуль или через batch api

Аватар пользователя smallredstone smallredstone 2 июля 2012 в 19:23

Все гораздо проще на самом деле

<?php
define('DRUPAL_ROOT', getcwd());

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$cids = db_query('SELECT cid FROM {comment} WHERE cid>100')->fetchCol();
comment_delete_multiple($cids);

echo 'all done';

Надо поместить файл с этим кодом в корневую директорию и выполнить, открыв в браузере.
Через командную строку он не работает (не знаю еще как правильно сделать)

Аватар пользователя sg85 sg85 2 июля 2012 в 21:18

"smallredstone" wrote:
Поэтому вряд-ли кто решится SQL составлять.

Почему?

однако

"PVasili" wrote:
с 100 чего?

Вы не забывайте, что там по сути в одной таблице данные для ВСЕХ комментариев на ВСЕМ сайте.

Аватар пользователя zzzzzz zzzzzz 3 июля 2012 в 16:40

с 100 чего? - cid

нужно удалить все комменты начиная с сid 100 по последнюю

то что комменты лежат аж в четырех разных таблицах и не подумал, спасибо, буду искать оптимальное решение

а если кто уже знает пожалуйста отпишите

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 3 июля 2012 в 17:15

А чем не устраивает то, что предложил smallredstone?

upd: наверное даже файл создавать не надо, запустить в template.php из какого-нибудь хука обработки страницы

Аватар пользователя sg85 sg85 3 июля 2012 в 17:26

Вы либо не совсем понимаете последствий, либо я чего-то не понимаю(в вашем случае будет проще набрать 100 комментов и отключить возможность комментирования, и задача решена и удалять лишние комменты придется 1 раз) DELETE c, fd, fr, nc FROM {comment} AS c, {field_data_comment_body} AS fd, {field_revision_comment_body} AS fr, {node_comment_statistics} AS nc WHERE c.cid > 100 AND c.cid = fd.cid AND fd.cid=fr.cid AND nc.cid=c.cid(не помню точно чем там все эти таблицы между собой вяжутся, однако смысл вроде должен быть понятен) после выполнения этого запроса, у вас останется 100 первых комментов(если конечно ничего не удаляли), может получиться так, что все 100 будут у одного материала, а у всех остальных будет всегда 0, ну или у одного материала 60, у другого 40, у остальных всегда 0. Или условия все же другие?

Аватар пользователя sg85 sg85 3 июля 2012 в 17:29

З.Ы. Метод smallredstone безопасный, но очень долгий(под очень долгим, значит, что Вы рискуете словить таймаут при выполнении(вроде 200 коментов для этого должно хватить на среднем хостинге)), потому его разумнее пихать в пакетник, прямой SQL запрос используйте только если вы уверены в своих действиях и осознаете последствия.

Совсем забыл, там еще и сущности подвязаны

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 3 июля 2012 в 17:25

скорее всего просто капчу сайта пробили (если она вообще была) и пошел спам. Надежды на то, что в последнее время были комментарии мало, вот и решили удалить махом все что понаприходило. Угадал?)

Аватар пользователя sg85 sg85 4 июля 2012 в 2:55

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