Объединение дочерних результатов в родительский (запрос один ко многим) - PullRequest
1 голос
/ 03 января 2012

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

Родитель

id |имя

ребенок

id |parentId |имя

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

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

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

Ответы [ 2 ]

1 голос
/ 03 января 2012

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

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

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

1 голос
/ 03 января 2012

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

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

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

В таком случае возвращение является нормальнымдва набора результатов.
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

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

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

...