За последние 24 часа нас посетили 20579 программистов и 1330 роботов. Сейчас ищут 723 программиста ...

Подзапрос в запросе delete

Тема в разделе "MySQL", создана пользователем Volt(220), 23 мар 2010.

  1. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Область:
    Разбираюсь с деревьями.
    Использую способ хранения типа такого:
    http://www.php.ru/forum/viewtopic.php?t=20735
    Стратегическая задача:
    Переопределить родителя вершины.
    Тактическая задача:
    Отвязать вершину с поддеревом от текущего родителя.
    Решение:
    PHP:
    1. <?php
    2. $allChilds="select id from table where pid=$idChild";
    3. $allParents="select pid from table where id=$idChild and pid<>$idChild";
    4. $delete="delete from table where id in ($allChildsand) and pid in ($allParents)";
    и все бы хорошо но:
    Вопрос:
    Как лучше обойти это ограничение?

    Предположения:
    1) Выбирать $allChilds и $allParents во временную таблицу. Использовать ее в подзапросах.
    2)
    PHP:
    1. <?php
    2. $allChilds="select $f from $table where $pid=$idChild";
    3. $allParents="select $pid from $table where $f=$idChild and $pid<>$idChild";
    4.    
    5. $childs="(".implode(",",$DB->getColumn($allChilds)).")";
    6. $parents="(".implode(",",$DB->getColumn($allParents)).")";
    7.                
    8. $delete="delete from $table where $f in $childs and $pid in $parents";
    9.  
    Обоим решениям не хватает... изящества что ли. Ну и не хочется мне посылать 3 запроса вместо одного...
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А придется.

    Если бы хранил без изврата с уровнем, то делалось бы ровно 1 запросом на апдейт.
    TheShock'у писали, что его вариант на глубоких деревьях, да при манипуляциях крайне неудобен.
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Зато он очень удобен на выборке.

    А без изврата с уровнем я не представляю простого способа вытащить непосредственного родителя или поддерево...

    Стоп... А где посмотреть (или по какому термину искать) про то же но без уровня?
     
  4. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Что мешает написать вот так?
    [sql]delete from table
    where
    id in (select id from table where pid=$idChild) and
    pid in (select pid from table where id=$idChild and pid<>$idChild)[/sql]
     
  5. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Goryn
    Именно это я и пытался написать, но
    =))
     
  6. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Хм., действительно не прокатывает, запрос писал без проверки на живых данных. Поверил, правда на MsSql, тоже в ошибку вывалился.
     
  7. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Может покопать в сторону EXISTS :?:
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Volt(220)
    Без уровня у тебя просто AL, где pid надо проапдейтить у одной записи :)

    MP, кстати надо подумать, там скорее всего тоже можно одним запросом, но очень тяжелым
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Simpliest
    Это если списком смежности хранить.
    А без уровня, но со всеми родителями все равно придется отвязать поддерево от всех родителей корня и привязать ко всем родителям новой вершины.

    UPD: Пока писал ответ уже немного поменялся. =)
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
     
  11. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В том то и дело что не просто AL, а с кучей дополнительных связей, которые без уровня слабо помогают.

    К MP у меня пока душа не лежит. Хотя похоже это наиболее простой вариант (надо только глянуть насколько усложняется выбор поддерева и всего дерева). Да и вопрос в общем то не в том чтобы найти лучший способ хранения, а в том чтобы разобраться с текущим...
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Простой LIKE

    Или можно похимичить с доп.таблицей, тогда JOIN.