|
|
|
| Дело такое. Имеется запрос который выбирает ид, автора из таблицы post где ид=удаляемой новости:
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
|
При удалении новости обновляется счетчик кол. новостей у юзера который оставил эту новость:
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1 where name='{$row['autor']}'");
|
Дело в том, что разработчики не учли обновления счетчика комментариев у юзеров. К примеру: новость с 5-тьма комментами удаляется, счетчик новостей обновляется, а комментариев остается прежним, т.е. кол. комментов как было так и осталось.
Немного о связях таблиц:
Таблица post имеет поля: id autor ................
Таблица comments имеет поля: id post_id user_id ............
Связаны как видим id&post_id
Как я думаю написать запрос...
$comm = $db->super_query("SELECT COUNT( * ) as count FROM " . PREFIX . "_comments WHERE post_id =".$row['id']." AND autor = '{$row['autor']}'");
|
Изменяю обновление:
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1, comm_num=comm_num-".$comm['count']." where name='{$row['autor']}'");
|
Теперь дело таково:
В новости 3 коментария: 1 админ и 2 юзера pupkin. Так вот удаляю админом новость, у него счетчики 0/0, а у юзера pupkin 0/2. Тоесть не обновило юзеру кол. комментов :( Помогите разобраться..Заранее благодарен!
Добавлю кусок кода:
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
if ($row['id']) {
$comm = $db->super_query("SELECT COUNT( * ) as count FROM " . PREFIX . "_comments WHERE post_id =".$row['id']." AND autor = '{$row['autor']}'");
$db->query("DELETE FROM " . PREFIX . "_post WHERE id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll_log WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_tags WHERE news_id = '{$row['id']}'");
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1, comm_num=comm_num-".$comm['count']." where name='{$row['autor']}'");
|
чето у меня мысли насчет массива складываються типа:
admin =>1
pupkin=>2
Если верно сужу, то надо по нему проходиться в цикле и обновлять, но для этого нужно исправить запрос $comm. Помогите пожалуйста.
вот собственно этот массив:
$comm = $db->super_query("SELECT autor, COUNT(*) as count FROM " . PREFIX . "_comments where post_id=".$row['id']." GROUP BY autor");
|
autor count
admin 1
pupkin 1
|
Теперь нужна помощь с циклом, в который поместить обновление и по очереди подставлять count в comm_num и autor в where name=... стоит заметить, что придется продублировать запрос:
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1, comm_num=comm_num-".$comm['count']." where name='{$row['autor']}'");
|
т.к. если в него подставлять в цикле, то те кто постили комменты в новостях будут получать минус пост в счетчике, что нам не нужно..сделаем так:
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1 where name='{$row['autor']}'");
for(){
$db->query("UPDATE " . USERPREFIX . "_users set comm_num=comm_num-"подставить из массива" where name="подставить из массива"");
}
|
напоследок моему занудству приведу всю логику, единственное прошу помочь с циклом!
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
if ($row['id']) {
$comm = $db->super_query("SELECT autor, COUNT(*) as count FROM " . PREFIX . "_comments where post_id=".$row['id']." GROUP BY autor");
$db->query("DELETE FROM " . PREFIX . "_post WHERE id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll_log WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_tags WHERE news_id = '{$row['id']}'");
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1 where name='{$row['autor']}'");
for(){
$db->query("UPDATE " . USERPREFIX . "_users set comm_num=comm_num-"подставить из массива" where name="подставить из массива"");
}
|
| |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 02:10)
| |
UPDATE users u
JOIN ( SELECT user_id, COUNT(user_id) AS cmts
FROM comments
WHERE post_id = $deleted_post_id
GROUP BY user_id
) AS s ON u.id = s.user_id
SET comm_num = comm_num - cmts
|
Если я правильно понял о чем речь | |
|
|
|
|
|
|
|
для: Trianon
(26.04.2009 в 02:37)
| | Повторюсь :)
напоследок моему занудству приведу всю логику, единственное прошу помочь с циклом!
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
if ($row['id']) {
$comm = $db->super_query("SELECT autor, COUNT(*) as count FROM " . PREFIX . "_comments where post_id=".$row['id']." GROUP BY autor");
$db->query("DELETE FROM " . PREFIX . "_post WHERE id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll_log WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_tags WHERE news_id = '{$row['id']}'");
$db->query("UPDATE " . USERPREFIX . "_users set news_num=news_num-1 where name='{$row['autor']}'"); //обновляю счетчик кол. постов у того кто постил эту новость
for(){
$db->query("UPDATE " . USERPREFIX . "_users set comm_num=comm_num-"подставить из массива" where name="подставить из массива""); //обновляю счетчики кол. комментариев у всех кто постил в этой новости
}
|
Массив получил в эту переменную $comm
autor count
admin 1
pupkin 1
|
| |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 02:56)
| | цикл не нужен.
upd.
Неужели в таблице post нет поля user_id ? | |
|
|
|
|
|
|
|
для: Trianon
(26.04.2009 в 08:26)
| | Вот бек пару таблиц:
CREATE TABLE `media_comments` (
`id` int(10) unsigned NOT NULL auto_increment,
`post_id` int(11) NOT NULL default '0',
`user_id` mediumint(8) NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`autor` varchar(40) NOT NULL default '',
`email` varchar(40) NOT NULL default '',
`text` text NOT NULL,
`ip` varchar(16) NOT NULL default '',
`is_register` tinyint(1) NOT NULL default '0',
`approve` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
FULLTEXT KEY `text` (`text`)
) ENGINE=MyISAM AUTO_INCREMENT=145 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=145 ;
|
CREATE TABLE `media_post` (
`id` int(11) NOT NULL auto_increment,
`autor` varchar(40) NOT NULL default '',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`short_story` text NOT NULL,
`full_story` text NOT NULL,
`xfields` text NOT NULL,
`title` varchar(255) NOT NULL default '',
`descr` varchar(200) NOT NULL default '',
`keywords` text NOT NULL,
`category` varchar(200) NOT NULL default '0',
`alt_name` varchar(200) NOT NULL default '',
`comm_num` smallint(5) unsigned NOT NULL default '0',
`allow_comm` tinyint(1) NOT NULL default '1',
`allow_main` tinyint(1) unsigned NOT NULL default '1',
`allow_rate` tinyint(1) unsigned NOT NULL default '1',
`approve` tinyint(1) NOT NULL default '0',
`fixed` tinyint(1) NOT NULL default '0',
`rating` smallint(5) NOT NULL default '0',
`allow_br` tinyint(1) NOT NULL default '1',
`vote_num` smallint(5) unsigned NOT NULL default '0',
`news_read` mediumint(8) unsigned NOT NULL default '0',
`votes` tinyint(1) NOT NULL default '0',
`access` varchar(150) NOT NULL default '',
`expires` date NOT NULL default '0000-00-00',
`symbol` varchar(3) NOT NULL default '',
`flag` tinyint(1) NOT NULL default '1',
`editdate` varchar(15) NOT NULL default '',
`editor` varchar(40) NOT NULL default '',
`reason` varchar(255) NOT NULL default '',
`view_edit` tinyint(1) NOT NULL default '0',
`tags` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `autor` (`autor`),
KEY `alt_name` (`alt_name`),
KEY `category` (`category`),
KEY `approve` (`approve`),
KEY `allow_main` (`allow_main`),
KEY `date` (`date`),
KEY `symbol` (`symbol`),
KEY `comm_num` (`comm_num`),
KEY `tags` (`tags`),
FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`)
) ENGINE=MyISAM AUTO_INCREMENT=232 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=232 ;
|
| |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 22:40)
| | Впечатление такое, что пользователи к этой борде уже потом прикручивались. | |
|
|
|
|
|
|
|
для: Trianon
(26.04.2009 в 22:58)
| | Хмм...в смысле? Добавляю новость (она записывается в таблицу post), добавляю разными юзерами комменты в эту новость (они записываются в таблицу comments со ссылкой на эту новость). Вот использовал запрос выше приведенный, видать неправильно записал.
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
if ($row['id']) {
$db->query("DELETE FROM " . PREFIX . "_post WHERE id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_poll_log WHERE news_id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_tags WHERE news_id = '{$row['id']}'");
$db->query("UPDATE autor u JOIN ( SELECT user_id, COUNT(user_id) AS cmts FROM " . USERPREFIX . "_comments WHERE post_id = $id GROUP BY user_id ) AS s ON u.id = s.user_id SET comm_num = comm_num - cmts ");
|
ошибка:
UPDATE autor u JOIN ( SELECT user_id, COUNT(user_id) AS cmts FROM media_comments WHERE post_id = 232 GROUP BY user_id ) AS s ON u.id = s.user_id SET comm_num = comm_num - cmts
|
| |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 23:07)
| | Во-первых, какая именно?
Во-вторых, ну так думать-то ведь никто не запрещал?
Если сперва из таблицы с комментариями всё удалить, какой смысл потом по ней апдейт делать? | |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 23:07)
| | За каким чортом Вы растянули запрос в непрерывную строку?
Чтоб текст в ширину окна не влезал?!! | |
|
|
|
|
|
|
|
для: Trianon
(26.04.2009 в 23:21)
| | насчет растяжки запроса за пределы окна я не учел:(
ах да я не подумал, что нужно выше поместить запрос обновления:
$row = $db->super_query("SELECT id, autor FROM " . PREFIX . "_post where id = '$id'");
if ($row['id']) {
$db->query("UPDATE autor u JOIN ( SELECT user_id, COUNT(user_id) AS cmts
FROM " . USERPREFIX . "_comments WHERE post_id = $id GROUP BY user_id ) AS s ON
u.id = s.user_id SET comm_num = comm_num - cmts ");
$db->query("DELETE FROM " . PREFIX . "_post WHERE id='{$row['id']}'");
$db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'");
................
|
ошибка ниже я указал, повторюсь:
UPDATE autor u JOIN ( SELECT user_id, COUNT(user_id) AS cmts FROM media_comments
WHERE post_id = 233 GROUP BY user_id ) AS s ON u.id = s.user_id SET
comm_num = comm_num - cmts | |
|
|
|
|
|
|
|
для: TetRiska
(26.04.2009 в 23:34)
| | Еще раз.
Какая ошибка диагностируется?
Не какой запрос её вызывает, а какую диагностику возвращает сервер MySQL?
Вполне возможно, что в запросе и вправду ошибка. Я его не проверял.
Но сервер-то на ошибки как-то реагирует? | |
|
|
|
|
|
|
|
для: Trianon
(26.04.2009 в 23:43)
| | Прошу прощения все сработало :) Обновлял нету таблицу и поля попутал :) Благодарю за помощь | |
|
|
|
|