Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вложенные запросы 
V
    Опции темы
MaliceInWonderland
Дата 22.6.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Задача: каскадно удалить 555000 ($id) и все зависимые от него прямо или косвенно поля (зависимость отображается в полях pid, pid2). Количество вложенных уровней заранее неизвестно. 

Например:

+------------+------------+---
| id | pid | pid2 |
+-----------------------------+
| 555000 | 000000 | 000000 |
| 555001 | 555000 | 000000 |
| 327000 | 555000 | 555001 |
| 327001 | 327000 | 000000 |
| 327002 | 327000 | 333000 |
+------------+------------+----
И.т.д. 


Пыталась написать вложенный запрос, но данные теряются: 

Код

delete * from catalogue where id='$id' or pid='$id' or pid2='$id' or pid in (select id from catalogue where pid in (select id from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in (select id from catalogue where pid='$id' or pid2='$id')) or pid2 in (select id from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in (select id from catalogue where pid='$id' or pid2='$id'))) or pid2 in (select id from catalogue where pid in (select id from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in (select id from catalogue where pid='$id' or pid2='$id')) or pid2 in (select id from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in (select id from catalogue where pid='$id' or pid2='$id')));

PM MAIL   Вверх
muzer
Дата 22.6.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Если я правильно понял проблему, вам поможет конструкция "DELETE FROM table1, table2 USING table1, table2, table3 WHERE ..."
При таком запросе данные удалятся из таблиц table1 и table2. При выборке записей, которые нужно удалить, будут использоваться таблицы table1, table2, table3 (их можно перечислять как в SELECT'е, то есть, например, использовать разные JOIN'ы).
PM WWW   Вверх
igorold
Дата 22.6.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Цитата

зависимые от него прямо или косвенно поля (зависимость отображается в полях pid, pid2). Количество вложенных уровней заранее неизвестно. 

нет, он же говорит - удалить все зависимые записи

т.е. я так понял, что если удаляемое значение id=555000, то нужно удалить запись и с id=555001 и с id=327000 и т.д. - в данном примере,
хотя если я правильно понял, то в приведенном примере придется удалить все записи ... 

или MaliceInWonderland, уточнить условие ...  smile 


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
MaliceInWonderland
Дата 23.6.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Цитата

т.е. я так понял, что если удаляемое значение id=555000, то нужно удалить запись и с id=555001 и с id=327000 и т.д. - в данном примере,

да. 
пример не совсем корректный. придется удалить все записи (они все связаны с 555000) 
PM MAIL   Вверх
sTa1kEr
Дата 27.6.2007, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



А Foregin Keys-ы с каскадным удалением не подойдут? Конечно, придется следить, за тем что бы не было "левых" id, но зато можно удалять одним простым запросом
Код

DELETE FROM `table` WHERE `id` = 555000

Иначе нескольками SELECT-ами или хранимкой.
PM MAIL   Вверх
MaliceInWonderland
Дата 27.6.2007, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



справилась с помощью пошаговой пометки в поле status_del. 
выполняю запрос 1 уровня и присваиваю значение 1. и.т.п.

Код

delete from kadry where status_del=1; 

PM MAIL   Вверх
igorold
Дата 27.6.2007, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Цитата(MaliceInWonderland @  27.6.2007,  07:02 Найти цитируемый пост)
справилась с помощью пошаговой пометки в поле status_del. 
выполняю запрос 1 уровня и присваиваю значение 1. и.т.п.

а как же вложенность? как с этим справилась?


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
MaliceInWonderland
Дата 27.6.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Цитата(igorold @ 27.6.2007,  08:01)
а как же вложенность? как с этим справилась?

+ PHP

Код

$sql = "select * from catalogue where id='$id' or pid='$id' or pid2='$id'";
$res = mysql_query($sql);    
for($result = array(); $row = mysql_fetch_assoc($res) ;)    
$result[] = $row['id'];
$result  = empty($result) ? "()" : ("('". implode("','", $result) ."')");
$sql01 = "update catalogue set status_del = '1' where id in $result"; 
$res01 = mysql_query($sql01);

$sql2 = "select * from catalogue where  pid in $result or pid2 in $result";


некрасиво,  но иначе не получается. 


Это сообщение отредактировал(а) MaliceInWonderland - 27.6.2007, 12:46
PM MAIL   Вверх
igorold
Дата 27.6.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



ну это у тебя получилось как бы 2 уровня зависимости отследить, а ты же говорила их больше ... ?


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1168 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.