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

Форум MySQL

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

 

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

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

тема: Как сделать такой запрос?
 
 автор: tAleks   (23.11.2006 в 11:53)   письмо автору
 
 


DELETE FROM pict_groups WHERE code_group = ".$code."
    AND NOT EXISTS (SELECT * FROM pict_groups WHERE code_parent = ".$code." LIMIT 1)
    AND NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1)
                    LIMIT 1


Во вложенном запросе EXISTS нельзя использовать таблицу pict_groups. А мне надо. Как это сделать?

   
 
 автор: Trianon   (23.11.2006 в 12:02)   письмо автору
 
   для: tAleks   (23.11.2006 в 11:53)
 

а какая версия сервера?

   
 
 автор: tAleks   (23.11.2006 в 12:15)   письмо автору
 
   для: Trianon   (23.11.2006 в 12:02)
 

MySQL 5.0.18-max

   
 
 автор: Trianon   (23.11.2006 в 13:04)   письмо автору
 
   для: tAleks   (23.11.2006 в 12:15)
 

В таком свежем однозначно существует конструкция

DELETE таблицы_из_которых_удалять_строки FROM таблицы_в_которых_вести_выборку .... 

Более точно посоветовать не могу, потому что Ваш запрос имеет логические ошибки:
Конструкция LIMIT 1 бессмысленна, если не задан порядок выборки записей. И бесполезна, если выборка идет по уникальному ключу.

Вы бы поточнее описали, что в таблицах лежит, и что Вы хотите с ними сделать.

   
 
 автор: tAleks   (23.11.2006 в 14:33)   письмо автору
 
   для: Trianon   (23.11.2006 в 13:04)
 

Вообще удаляю запись из таблицы "pict_groups" с кодом "code_group = ".$code." " - это группа каталога с бесконечной вложенностью.
Ее надо удалить, но только в том случае, если в ней нет других ргупп. И нет записей (картинок).

Проверяю, есть ли в удаляемой группе другие группы.

NOT EXISTS (SELECT * FROM pict_groups WHERE code_parent = ".$code." LIMIT 1)  


Проверяю, есть ли в удаляемой группе картинки.

NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1)  


Но это ч.п. не работает.... :(

   
 
 автор: Trianon   (23.11.2006 в 14:52)   письмо автору
 
   для: tAleks   (23.11.2006 в 14:33)
 

непонятно, какое поле в таблице pict Вы проверяете.
Вообще конструкция EXISTS (SELECT * недопустима.
Вместо звездочки надо указывать конкретное поле.

   
 
 автор: tAleks   (23.11.2006 в 16:20)   письмо автору
 
   для: Trianon   (23.11.2006 в 14:52)
 

>непонятно, какое поле в таблице pict Вы проверяете.
>Вообще конструкция EXISTS (SELECT * недопустима.
>Вместо звездочки надо указывать конкретное поле.

Как это недопустима? А в книжке "Самоучитель MySQL 5", авторами которой являются М. Кузнецов и И. Симдянов, написано что можно.
И в книжке "MySQL Справочник по языку", написано: "MySQL игнорирует спиок SELECT в таком подзапросе, поэтому это не важно".

   
 
 автор: Trianon   (23.11.2006 в 16:53)   письмо автору
 
   для: tAleks   (23.11.2006 в 16:20)
 

Прошу прощения. C IN() перепутал.

   
 
 автор: Trianon   (23.11.2006 в 17:04)   письмо автору
 
   для: tAleks   (23.11.2006 в 16:20)
 


DELETE pict_groups 
FROM pict_groups dl 
  LEFT JOIN pict_groups ch ON dl.code_group =ch.code_parent 
  WHERE dl.code_group = $code 
    AND ch.code_parent IS NULL 
    AND  NOT dl.code_group IN (SELECT code_group as pc FROM pict WHERE pc = $code)

   
 
 автор: tAleks   (23.11.2006 в 12:59)   письмо автору
 
   для: tAleks   (23.11.2006 в 11:53)
 

Ну так можно такой зарос как-нибудь сделать?

   
 
 автор: AlexelA   (23.11.2006 в 13:28)   письмо автору
 
   для: tAleks   (23.11.2006 в 11:53)
 

Попрбуйте так:

DELETE FROM pict_groups a WHERE a.code_group = ".$code."
AND NOT EXISTS (SELECT * FROM pict_groups b WHERE b.code_parent = ".$code."
and a.code_group = b.code_group LIMIT 1)
AND NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1)
LIMIT 1

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

   
 
 автор: tAleks   (23.11.2006 в 13:35)   письмо автору
 
   для: AlexelA   (23.11.2006 в 13:28)
 

Вообще удаляю запись из таблицы "pict_groups" с кодом "code_group = ".$code." " - это группа каталога с бесконечной вложенностью.
Ее надо удалить, но только в том случае, если в ней нет других ргупп. И нет записей (картинок).

Проверяю, есть ли в удаляемой группе другие группы.

NOT EXISTS (SELECT * FROM pict_groups WHERE code_parent = ".$code." LIMIT 1) 


Проверяю, есть ли в удаляемой группе картинки.

NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1) 


Но это ч.п. не работает.... :(

   
 
 автор: AlexelA   (23.11.2006 в 13:59)   письмо автору
 
   для: tAleks   (23.11.2006 в 13:35)
 

Насколько я понял из вашего объяснения, как только в
группе появляются подгруппы, автоматически устанавливается
флаг в поле "code_parent". Значит, вместо строки

NOT EXISTS (SELECT * FROM pict_groups WHERE code_parent = ".$code." LIMIT 1)

достаточно записать

... and pict_groups.code_parent = 'null' ...

этим мы проверяем поле "code_parent" таблицы "pict_group" на равенство
начальному значению (я так понимаю "null"), т.е. группа не содержит подгрупп.

   
 
 автор: tAleks   (23.11.2006 в 14:20)   письмо автору
 
   для: AlexelA   (23.11.2006 в 13:59)
 

>Насколько я понял из вашего объяснения, как только в
>группе появляются подгруппы, автоматически устанавливается
>флаг в поле "code_parent".

>Значит, вместо строки
>NOT EXISTS (SELECT * FROM pict_groups WHERE code_parent = ".$code." LIMIT 1)
>
>достаточно записать
>
>... and pict_groups.code_parent = 'null' ...
>


Нет, не правильно.
"code_parent" всегад пишется у любой группы.
Структура таблицы:

CREATE TABLE `pict_groups` (
  `id_group` int(11) NOT NULL auto_increment,
  `code_group` int(11) NOT NULL,
  `date_add` date default NULL,
  `name` tinytext,
  `description` tinytext,
  `folder` tinytext,
  `pos` int(11) default NULL,
  `showhide` enum('show','hide') default 'hide',
  `code_parent` int(11) NOT NULL,
  PRIMARY KEY  (`id_group`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Группы изображений' AUTO_INCREMENT=57 ;


По "code_parent" мы опреедляем кто родитель. и он есть у всех групп.

   
 
 автор: AlexelA   (23.11.2006 в 14:46)   письмо автору
 
   для: tAleks   (23.11.2006 в 14:20)
 

Ну тогда предлагаю вообще избавиться в этом
подзапросе от "exists", заменив выражением

1 > (select count(*) from pict_groups WHERE code_parent = ".$code.")

Итоговое выражение

DELETE FROM pict_groups a WHERE a.code_group = ".$code."
AND 1 > (select count(*) from pict_groups b WHERE code_parent = ".$code."
and a.code_group = b.code_group)
AND NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1)
LIMIT 1

Попробуйте так.

   
 
 автор: tAleks   (23.11.2006 в 15:07)   письмо автору
 
   для: AlexelA   (23.11.2006 в 14:46)
 

>Итоговое выражение
че то я вот это не понял:

>DELETE FROM pict_groups a WHERE a.code_group = ".$code."
>AND 1 > (select count(*) from pict_groups b WHERE code_parent = ".$code."
> and a.code_group = b.code_group)
>AND NOT EXISTS (SELECT * FROM pict WHERE code_group = ".$code." LIMIT 1)
>LIMIT 1

"pict_groups a". "а" - это что, псевдоним? Но на сколько я заню, псеводнимы пишутся так: "pict_groups AS a".
Или это из какой-то другой СУБД? Или что это вообще такое?

   
 
 автор: tAleks   (23.11.2006 в 15:15)   письмо автору
 
   для: AlexelA   (23.11.2006 в 14:46)
 

нифига не работает.

Ругается вот такими словами:

1093: You can't specify target table 'pict_groups' for update in FROM clause


На сколько я понимаю, это ему не нравиться 'pict_groups' во вложенном запросе.

   
 
 автор: AlexelA   (23.11.2006 в 15:42)   письмо автору
 
   для: tAleks   (23.11.2006 в 15:15)
 

<pict_groups a> это действительно псевдоним, но для таблицы
оператор <as> используется для псевдонима столбца

Посмотрев на ошибку, могу сказать лишь одно,
мы пытаемся одновременно произвести чтение
и запись в одну и ту же таблицу, что некорректно.
Простым вариантом будет создание двух запросов:
первым вы определите имеются ли вложения в группе
вторым их удалите
Если такой вариант подходит - прекрасно, нет - будем думать дальше

   
 
 автор: tAleks   (23.11.2006 в 15:47)   письмо автору
 
   для: AlexelA   (23.11.2006 в 15:42)
 

Не, ну так-то конечно 2 запроса будут выполнять требуемую функцию, но это ж длинно.... а хочется по короче...

Пока остановлюсь на 2 запросах, но тема остается актуальной.... :)

Всем, кто прилагал усилия, и еще приложит - спасибо!

   
 
 автор: tAleks   (23.11.2006 в 15:53)   письмо автору
 
   для: AlexelA   (23.11.2006 в 15:42)
 

><pict_groups a> это действительно псевдоним, но для таблицы
>оператор <as> используется для псевдонима столбца

и еще, что-то я не видал ни где, про назначение псевдонимов таблицам. Где это написано? Дайте ссылку ознакомиться.

   
 
 автор: AlexelA   (23.11.2006 в 16:05)   письмо автору
 
   для: tAleks   (23.11.2006 в 15:53)
 

Пожалуйста, читайте на здоровье:
http://www.mysql.ru/docs/pautov/sql.htm#Select
Вас будет интересовать раздел "Псевдонимы".

   
Rambler's Top100
вверх

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