Nano Hash - криптовалюты, майнинг, программирование

Наименее интенсивный способ найти все вложенные подкатегории с помощью запроса mysql

У меня есть база данных, в которой элементы помещаются в категории. Некоторые из этих категорий являются вложенными, например:

Animals > Birds > Parrots  
Animals >  Birds > Penguin 
Animals > Mammals > Cats  
Animals > Mammals > Dogs 
Animals > Reptiles > Snakes 
Plants > Trees 
Plants > Flowers

и т.д

У меня есть это в таблице по строкам

CATEGORY    PARENT
Animals     -
Birds       Animals
Penguin     Birds

и т.д

Я хотел бы иметь возможность взять отправную точку, скажем, «Животные» и перечислить все подкатегории, которые подпадают под нее, поэтому для животных мы бы перечислили птиц, млекопитающих, рептилий, попугаев, пингвинов, кошек, собак, змей.

Возможно ли это с помощью одного запроса? Если нет, что мне нужно сделать

ТИА

27.05.2010

  • Два варианта: (1) Выберите все содержимое таблицы одним запросом и выполните обход в PHP [плохая идея для больших наборов данных] (2) Рассмотрите возможность замены вашей родительской/дочерней схемы на вложенные наборы dev.mysql.com/tech-resources/articles/hierarchical-data.html 28.05.2010

Ответы:


1

Вы можете избежать рекурсии и использовать одиночные запросы для поиска количества дочерних элементов, непосредственных категорий и подкатегорий с помощью одного SQL-запроса, следуя приведенной ниже статье «Измененный обход дерева предварительного заказа»:

  1. Управление иерархическими данными в MySQL

Найдите в google.com ключевые слова «Измененный обход дерева + Sitepoint», чтобы прочитать статью на sitepoint.com, в которой объясняется тот же шаблон.

04.08.2010
  • Отличная ссылка! Спасибо, что поделился! 10.02.2019

  • 2

    Это возможно и эффективно сделать с помощью одного запроса, если вы добавите в свою схему некоторые метаданные иерархии.

    Добавьте два целочисленных столбца (start и end) в таблицу категорий. Затем выполните обход вашего дерева в глубину, увеличивая счетчик на каждом шаге и присваивая значение счетчика start при входе в узел и end при выходе (т.е. когда все его дочерние элементы были обработаны).

    Итак, для вашего примера со значениями, показанными как (start,end):

    Animals (1,18)
       Birds (2,7)
          Parrots (3,6 )
          Penguin (4,5)
       Mammals (8,13)
          Cats (9,12)
          Dogs (10,11)
       Reptiles (14,17)
          Snakes (15,16)
    Plants (19,24)
       Trees (20,23)
       Flowers (21,22)
    

    Теперь, чтобы выбрать получение животных и их дочерних элементов, вы можете просто запустить что-то вроде этого запроса:

    SELECT * FROM Category where start >=1 and start < 18
    

    Очевидно, вы взвесили стоимость восстановления метаданных при изменении иерархии по сравнению с эффективностью запросов на чтение. Для относительно статичных иерархий этот метод работает достаточно хорошо.

    28.05.2010

    3

    SQL, как известно, плохо справляется с иерархическими данными.

    Я бы запрограммировал это и рекурсивно или итеративно нашел бы всех детей.

    должен работать следующий псевдокод (если в данных нет циклов)

    • добавить детей животных в массив A
    • индекс = 0
    • while index < length(A)
      • append children(A[i]) to array
      • индекс = индекс + 1

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

    27.05.2010

    4

    Я мало знаю о процедурах mysql для получения данных, но мы можем получить вложенные данные, используя одиночный запрос mysql с помощью PHP, вы можете использовать одну и ту же логику для любого языка.

    http://www.maheshchari.com/php-nested-categories-with-single-mysql-query/

    21.04.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..