За последние 24 часа нас посетили 21620 программистов и 1028 роботов. Сейчас ищут 762 программиста ...

Цепочка связанных записей

Тема в разделе "MySQL", создана пользователем IvanKut, 30 сен 2020.

  1. IvanKut

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

    С нами с:
    27 июл 2018
    Сообщения:
    258
    Симпатии:
    0
    Привет
    У меня есть таблица в которой объект РОДИТЕЛЬ привязывается к ДОЧЕРНЕМУ объекту.
    И такие связи могут выстраиваться в цепочку
    [​IMG]
    То есть бы объект 1 к нему привязали объект 2.
    Потом к 2 проивязали 3
    И так далее

    Мне нужно для входного параметра ID(например 4) получить все уникальные привязанные ID, в том числе и в подчиненных связках(в данном случае 4 привязан напрямую только к 3, но косвенно через суб связи привязан к 2,1,5,6)

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

    Благодарю за помощь!

    Код (Text):
    1. CREATE TABLE `test_comment` (
    2.   `id1` int(11) NOT NULL,
    3.   `id2` int(11) NOT NULL
    4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    5.  
    6. /*Data for the table `test_comment` */
    7.  
    8. insert  into `test_comment`(`id1`,`id2`) values
    9. (1,2),
    10. (2,3),
    11. (3,4);
    12. (4,5);
    13. (5,6);
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    "Мне нужно..." => "Сколько платишь?" :)

    Ты пытаешся заново изобрести древовидную иерархию. Эта тема очень подробна изучена и есть популярные подходы к решению. Есть готовые библиотеки и компоненты. Надо только искать правильно. Дам контекст для поиска:

    Adjacency List (AL): когда в одно таблице есть поля id (первичный ключ) и parent_id (внешний ключ, ссылающийся на id)

    Nested Sets (NS): когда у записи есть поля left и right. Все остальные записи считаются "вложенными" в эту если их left попадает в промежуток между left и right родительской записи.

    Materialized Path (MP): когда каждая запись имеет строковое поле, подобное рубрикатору в каком-нибудь каталоге:
    1
    1.1
    1.1.1
    1.1.2
    1.2.1
    1.2.2
    всё, что начинается на "1.1." будет дочерним по отношению к "1.1" и т.д.


    Удачи в поиске!
    типа https://www.google.com/search?php+mysql+adjacency+list
     
  3. IvanKut

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

    С нами с:
    27 июл 2018
    Сообщения:
    258
    Симпатии:
    0
    @artoodetoo благодарю ключи! Пошел изучать!
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Как правило, это делают с помощью php.
    Гуглите "mysql дерево категорий"
    Хотя, если нужно получить все существующие ветки, то можно и триггер сделать.
     
  5. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Да, чуть не забыл.
    В решении этой задачи есть одна проблема - ссылающиеся друг на друга записи.
    Чтобы скрипт не вошел в бесконечный цикл - ставьте ограничение количества итераций.