За последние 24 часа нас посетили 17168 программистов и 1300 роботов. Сейчас ищут 1577 программистов ...

Выбрать ссылки на несуществующие записи

Тема в разделе "MySQL", создана пользователем pel, 2 фев 2007.

  1. pel

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

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    Есть база, структура:
    id | parentid | level | name | desc | ...
    Здесь level - уровень "вложенности" элемента ([0-4]), parentid - id родительского эл-та. Например:
    Код (Text):
    1. id |par|lvl|   name   |
    2. --------------------------
    3.  1 | 0 | 1 | ПВХ Системы | ...
    4.  2 | 1 | 2 | TM Wintech | ...
    5.  3 | 1 | 2 | TM Aluplast | ...
    6.  4 | 2 | 3 | О компании Wintech | ...
    7.  5 | 2 | 3 | Каталог Wintech | ...
    8.  6 | 3 | 3 | Каталог Aluplast | ...
    9.  7 | 10 | 3 | запись с id==10 отсутствует | ...
    10.  8 | 12 | 2 | запись с id==12 отсутствует | ...
    11. Выводится как
    12. ПВХ Системы
    13.   - TM Wintech
    14.      - О компании ...
    15.      - Каталог ...
    16.   - TM Aluplast
    17.      - Каталог ...
    18. (записи № 7 и 8 никуда не выводятся)
    Можно ли как-то одним запросом выбрать все записи, для которых не существует записи с id == (текущему) parentid? Т.е. в примере - записи № 7 и 8

    "Делай перебор всей базы в цикле" предлагать только в случае, если одним-двумя запросами никак не обойтись :)
    (Это я тогда сам сделаю)
     
  2. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. SELECT a.id FROM table AS a LEFT JOIN table AS b ON a.parentid=b.id WHERE b.id IS NULL
    оно?
     
  3. pel

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

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    simpson, не-а. Не совсем :\
    Немного поправил:
    Код (Text):
    1. SELECT a.* FROM proddb AS a LEFT JOIN proddb AS b ON a.parentid=b.id WHERE b.id IS NULL AND a.level != 1
    (добавил level != 1, т.к. у записей 1го уровня parentid=0)
    Но все равно, выводятся только записи с parentid == 0.
    ...
    А вот если у меня в базе есть такие записи:
    Код (Text):
    1.  
    2. id |par|lvl|   name   |
    3. --------------------------
    4. 13 | 99 | 2 | 2й уровень, id 99 не существует | ...
    5. 14 | 13 | 3 | 3rd level, id 13 exists | ...
    6. 15 | 14 | 3 | 4th level, id 14 exists | ...
    Записи № 14 и 15 ссылаются на существующую запись №13.
    А вот 13я - на несуществующую №99
    И в результате надо удалить и 13ю, и 14ю, и 15ю
    Тут без цикла/перебора уже не обойтись?
     
  4. pel

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

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    simpson, ай!-) протупил я, Ваш запрос - то что надо! :)
    Сенкью, так сказать, ВЭРИ мач


    Обещаю в следующий раз _сначала_ внимательно думать, а потом уже писать на форум. :)