Наименее интенсивный способ найти все вложенные подкатегории с помощью запроса MySQL - PullRequest
3 голосов
/ 28 мая 2010

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

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

и т.д.

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

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

ТИА

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

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

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

Поищите на google.com ключевые слова "Модифицированный обход дерева + Sitepoint", чтобы прочитать статью на sitepoint.com, в которой объясняется та же картина.

1 голос
/ 28 мая 2010

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

Добавьте два целочисленных столбца (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

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

0 голосов
/ 21 апреля 2013

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

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

0 голосов
/ 28 мая 2010

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

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

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

  • добавить детей из массива в массив A
  • index = 0
  • в то время как индекс
    • добавить дочерние элементы (A [i]) в массив
    • index = index + 1

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

...