|
|
|
|
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. А мне надо. Как это сделать? | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 11:53)
| | а какая версия сервера? | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 12:02)
| | MySQL 5.0.18-max | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 12:15)
| | В таком свежем однозначно существует конструкция
DELETE таблицы_из_которых_удалять_строки FROM таблицы_в_которых_вести_выборку ....
|
Более точно посоветовать не могу, потому что Ваш запрос имеет логические ошибки:
Конструкция LIMIT 1 бессмысленна, если не задан порядок выборки записей. И бесполезна, если выборка идет по уникальному ключу.
Вы бы поточнее описали, что в таблицах лежит, и что Вы хотите с ними сделать. | |
|
|
|
|
|
|
|
для: 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)
|
Но это ч.п. не работает.... :( | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 14:33)
| | непонятно, какое поле в таблице pict Вы проверяете.
Вообще конструкция EXISTS (SELECT * недопустима.
Вместо звездочки надо указывать конкретное поле. | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 14:52)
| | >непонятно, какое поле в таблице pict Вы проверяете.
>Вообще конструкция EXISTS (SELECT * недопустима.
>Вместо звездочки надо указывать конкретное поле.
Как это недопустима? А в книжке "Самоучитель MySQL 5", авторами которой являются М. Кузнецов и И. Симдянов, написано что можно.
И в книжке "MySQL Справочник по языку", написано: "MySQL игнорирует спиок SELECT в таком подзапросе, поэтому это не важно". | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 16:20)
| | Прошу прощения. C IN() перепутал. | |
|
|
|
|
|
|
|
для: 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 в 11:53)
| | Ну так можно такой зарос как-нибудь сделать? | |
|
|
|
|
|
|
|
для: 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
А вообще, было бы не плохо, если бы вы пояснили что вы хотите сделать.Воможно
это реализууется намного проще. | |
|
|
|
|
|
|
|
для: 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)
|
Но это ч.п. не работает.... :( | |
|
|
|
|
|
|
|
для: 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"), т.е. группа не содержит подгрупп. | |
|
|
|
|
|
|
|
для: 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" мы опреедляем кто родитель. и он есть у всех групп. | |
|
|
|
|
|
|
|
для: 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
Попробуйте так. | |
|
|
|
|
|
|
|
для: 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".
Или это из какой-то другой СУБД? Или что это вообще такое? | |
|
|
|
|
|
|
|
для: AlexelA
(23.11.2006 в 14:46)
| | нифига не работает.
Ругается вот такими словами:
1093: You can't specify target table 'pict_groups' for update in FROM clause
|
На сколько я понимаю, это ему не нравиться 'pict_groups' во вложенном запросе. | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 15:15)
| | <pict_groups a> это действительно псевдоним, но для таблицы
оператор <as> используется для псевдонима столбца
Посмотрев на ошибку, могу сказать лишь одно,
мы пытаемся одновременно произвести чтение
и запись в одну и ту же таблицу, что некорректно.
Простым вариантом будет создание двух запросов:
первым вы определите имеются ли вложения в группе
вторым их удалите
Если такой вариант подходит - прекрасно, нет - будем думать дальше | |
|
|
|
|
|
|
|
для: AlexelA
(23.11.2006 в 15:42)
| | Не, ну так-то конечно 2 запроса будут выполнять требуемую функцию, но это ж длинно.... а хочется по короче...
Пока остановлюсь на 2 запросах, но тема остается актуальной.... :)
Всем, кто прилагал усилия, и еще приложит - спасибо! | |
|
|
|
|
|
|
|
для: AlexelA
(23.11.2006 в 15:42)
| | ><pict_groups a> это действительно псевдоним, но для таблицы
>оператор <as> используется для псевдонима столбца
и еще, что-то я не видал ни где, про назначение псевдонимов таблицам. Где это написано? Дайте ссылку ознакомиться. | |
|
|
|
|
|
|
|
для: tAleks
(23.11.2006 в 15:53)
| | Пожалуйста, читайте на здоровье:
http://www.mysql.ru/docs/pautov/sql.htm#Select
Вас будет интересовать раздел "Псевдонимы". | |
|
|
|