Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Очень нужна помощ в написании запроса
 
 автор: TetRiska   (26.04.2009 в 02:10)   письмо автору
 
 

Дело такое. Имеется запрос который выбирает ид, автора из таблицы 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="подставить из массива"");
            }

  Ответить  
 
 автор: Trianon   (26.04.2009 в 02:37)   письмо автору
 
   для: 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


Если я правильно понял о чем речь

  Ответить  
 
 автор: TetRiska   (26.04.2009 в 02:56)   письмо автору
 
   для: 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 

  Ответить  
 
 автор: Trianon   (26.04.2009 в 08:26)   письмо автору
 
   для: TetRiska   (26.04.2009 в 02:56)
 

цикл не нужен.

upd.
Неужели в таблице post нет поля user_id ?

  Ответить  
 
 автор: TetRiska   (26.04.2009 в 22:40)   письмо автору
 
   для: 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 ;

  Ответить  
 
 автор: Trianon   (26.04.2009 в 22:58)   письмо автору
 
   для: TetRiska   (26.04.2009 в 22:40)
 

Впечатление такое, что пользователи к этой борде уже потом прикручивались.

  Ответить  
 
 автор: TetRiska   (26.04.2009 в 23:07)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (26.04.2009 в 23:19)   письмо автору
 
   для: TetRiska   (26.04.2009 в 23:07)
 

Во-первых, какая именно?
Во-вторых, ну так думать-то ведь никто не запрещал?
Если сперва из таблицы с комментариями всё удалить, какой смысл потом по ней апдейт делать?

  Ответить  
 
 автор: Trianon   (26.04.2009 в 23:21)   письмо автору
 
   для: TetRiska   (26.04.2009 в 23:07)
 

За каким чортом Вы растянули запрос в непрерывную строку?
Чтоб текст в ширину окна не влезал?!!

  Ответить  
 
 автор: TetRiska   (26.04.2009 в 23:34)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (26.04.2009 в 23:43)   письмо автору
 
   для: TetRiska   (26.04.2009 в 23:34)
 

Еще раз.
Какая ошибка диагностируется?
Не какой запрос её вызывает, а какую диагностику возвращает сервер MySQL?

Вполне возможно, что в запросе и вправду ошибка. Я его не проверял.
Но сервер-то на ошибки как-то реагирует?

  Ответить  
 
 автор: TetRiska   (26.04.2009 в 23:56)   письмо автору
 
   для: Trianon   (26.04.2009 в 23:43)
 

Прошу прощения все сработало :) Обновлял нету таблицу и поля попутал :) Благодарю за помощь

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования