Присоединение дочерних результатов к родительским (запрос один ко многим)

Скажем, у меня есть две таблицы:

Родитель

идентификатор | имя

Ребенок

идентификатор | идентификатор родителя | имя

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

Я уже понял, что проще (и, вероятно, гораздо эффективнее) просто выполнить второй запрос для дочерних элементов, мне просто любопытно, какие существуют подходы. Один из подходов, который я обнаружил, заключался в использовании GROUP_CONCAT: http://hussfelt.net/blog/sql/group-join-one-to-many-relationship.

Существуют ли другие методы для достижения желаемого результата? Вопрос помечен как foxpro, потому что он специфичен для моей реализации, но независимый ответ тоже был бы замечательным.


person Calvin Froedge    schedule 03.01.2012    source источник
comment
группа concat исходит из MYSQL и объединяется с сервером sql. но я не знаю есть ли они в foxpro   -  person aF.    schedule 03.01.2012


Ответы (2)


Для обработки вы можете запросить общий запрос независимо от серверной части, например

select ;
      P.Name as ParentName ;
      C.* ;
   from ;
      Parent P ;
         JOIN Child C ;
            on P.ID = C.ParentID ;
   order by ;
      P.ParentName, ;
      C.Name ;
   into ;
      cursor C_YourResultSet

Затем вы можете просмотреть набор результатов и создать все, что вам нужно, например, сводку всех имен для одного родительского идентификатора.

person DRapp    schedule 03.01.2012

Во-первых, я настоятельно рекомендую не использовать GROUP_CONCAT. Группировка нескольких элементов данных в одно поле является антишаблоном SQL.


Обычный способ возврата этих данных это, как вы говорите, иметь одну строку для каждого дочернего элемента. Это наиболее обобщенное представление отношений 1:many.

Возможно вы не хотите возвращать клиенту повторяющиеся данные. Например; если вам нужны все сведения о родителях и детях для всей школы, вы можете не хотеть, чтобы имена родителей возвращались несколько раз, если в школе есть несколько детей.

В таком случае нормально возвращать два набора результатов.
1. Все родительские элементы, упорядоченные каким-либо образом
2. Все дочерние элементы, включая parent_id для обратной связи данных, в одном заказ

Несмотря на то, что order1 может быть "имя родителя", а сведения о детях не включают имена родителей, вы все равно можете упорядочивать по нему.

SELECT * FROM parents ORDER BY name
SELECT children.* FROM parents INNER JOIN children ON children.parent_id = parents.id ORDER BY parents.name

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


Будет ли полезен этот метод, зависит от объема трафика, который вы отправляете по сети. Обычно проще просто отправить избыточные данные. Там, где это проблематично, этот метод работает хорошо.

person MatBailie    schedule 03.01.2012