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

Форум MySQL

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

 

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

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

тема: Удаление при условии отсутствия записей в этой и в др. таблице
 
 автор: tAleks   (20.12.2007 в 23:19)   письмо автору
 
 


$sql_del_group = "
    DELETE FROM articles_groups
    WHERE id_group = $id
        AND NOT EXISTS (SELECT * FROM articles_groups WHERE pid_group = $id)
        AND NOT EXISTS (SELECT * FROM articles WHERE id_group = $id)";



Таблица articles_groups это таблица с группами.
Таблица articles - таблица со статьями.

В группах есть подгруппы. pid_group - это id родительской группы для вложенной группы.

Данный запрос ругается так: 1093 - You can't specify target table 'articles_groups' for update in FROM clause

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


Вопрос: можно ли сделать проверку существования вложенных групп и статей в группе, и удаление в одной записи?

   
 
 автор: tAleks   (21.12.2007 в 15:56)   письмо автору
 
   для: tAleks   (20.12.2007 в 23:19)
 

Никто не знает?

   
 
 автор: MIchail1982   (21.12.2007 в 16:48)   письмо автору
 
   для: tAleks   (20.12.2007 в 23:19)
 

может так?

DELETE FROM articles_groups  where id_group not in (SELECT id_group FROM articles)

   
 
 автор: tAleks   (21.12.2007 в 16:57)   письмо автору
 
   для: MIchail1982   (21.12.2007 в 16:48)
 

Не, так тоже не пойдет, потому что надо удалить группу если в ней нет вложенных групп.


придумал такой запрос, вроде работает:

$sql_del_group = "
    DELETE articles_groups
    FROM articles_groups
        LEFT JOIN articles_groups AS sub ON articles_groups.id_group = sub.pid_group
        LEFT JOIN articles ON articles_groups.id_group = articles.id_group
    WHERE articles_groups.id_group = $id 
        AND articles.id_article IS NULL 
        AND sub.id_group IS NULL";


Люди знающие, прокоментируйте плиз.

   
 
 автор: MIchail1982   (21.12.2007 в 17:26)   письмо автору
 
   для: tAleks   (21.12.2007 в 16:57)
 

DELETE articles_groups
FROM articles_groups
вы удалите таблицу из таблицы???
идея пред. скуэля такая:
удалить все группы, айди которых отсутствует в таблице статей
разве вы не этого добиваетесь??

   
 
 автор: tAleks   (21.12.2007 в 20:57)   письмо автору
 
   для: MIchail1982   (21.12.2007 в 17:26)
 

>DELETE articles_groups
> FROM articles_groups
>вы удалите таблицу из таблицы???

нет, я уделяю записи из таблицы

>идея пред. скуэля такая:
>удалить все группы, айди которых отсутствует в таблице статей
>разве вы не этого добиваетесь??

нет! Нужно удалить группу при условии если она пустая! Т.е. в ней нет вложенных групп, и в ней нет статей!

   
 
 автор: MIchail1982   (24.12.2007 в 10:33)   письмо автору
 
   для: tAleks   (21.12.2007 в 20:57)
 

а если добавить

DELETE FROM articles_groups  where id_group not in (SELECT id_group FROM articles) AND id_group=$id

   
 
 автор: tAleks   (24.12.2007 в 15:43)   письмо автору
 
   для: MIchail1982   (24.12.2007 в 10:33)
 

Ну, а второе услвие проверки?

Таким запросом мы удалялем группы в которых нет статей!
НО не проверяем что в ней нет вложенных групп!


AND NOT EXISTS (SELECT * FROM articles_groups WHERE pid_group = $id) 


Вот в чем прикол-то! Именно на это ругается мускул, что во вложенном запросе фигурирует таблица из которой производится удаление!

   
 
 автор: MIchail1982   (24.12.2007 в 16:56)   письмо автору
 
   для: tAleks   (24.12.2007 в 15:43)
 


DELETE FROM articles_groups  where id_group not in (SELECT id_group FROM articles) AND id_group not in (SELECT pid_group FROM articles) AND id_group=$id

странная у вас структура БД %0)

   
 
 автор: tAleks   (24.12.2007 в 21:37)   письмо автору
 
   для: MIchail1982   (24.12.2007 в 16:56)
 

pid_group нужно проверять не в статьях, а в группах!
А если его проверять в группах, то мускул ругается так:
1093 - You can't specify target table 'articles_groups' for update in FROM clause

   
 
 автор: MIchail1982   (25.12.2007 в 10:29)   письмо автору
 
   для: tAleks   (24.12.2007 в 21:37)
 

выложите структуру

   
 
 автор: tAleks   (26.12.2007 в 21:01)   письмо автору
 
   для: MIchail1982   (25.12.2007 в 10:29)
 


-- 
-- Структура таблицы `articles`
-- 

CREATE TABLE `articles` (
  `id_article` int(11) NOT NULL auto_increment,
  `name` tinytext,
  `description` tinytext,
  `html_title` tinytext,
  `html_description` tinytext,
  `html_keywords` tinytext,
  `pos` int(11) default NULL,
  `showhide` enum('show','hide') default 'hide',
  `datetime` datetime default NULL,
  `ann` enum('1','0') default '0',
  `id_group` smallint(5) unsigned default NULL,
  PRIMARY KEY  (`id_article`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=255 ;



-- 
-- Структура таблицы `articles_groups`
-- 

CREATE TABLE `articles_groups` (
  `id_group` smallint(6) NOT NULL auto_increment,
  `pid_group` smallint(6) default '0',
  `name` tinytext,
  `description` tinytext,
  `html_title` tinytext,
  `html_description` tinytext,
  `html_keywords` tinytext,
  `pos` smallint(6) default NULL,
  `showhide` enum('show','hide') default 'hide',
  `new` enum('1','0') default '0',
  `date_add` date default NULL,
  PRIMARY KEY  (`id_group`),
  KEY `pos` (`pos`,`showhide`,`date_add`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=42 ;


   
Rambler's Top100
вверх

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