запрос, возвращающий многомерные сгруппированные массивы - PullRequest
0 голосов
/ 02 ноября 2010

В гипотетическом сценарии, где у меня есть пара таблиц базы данных, в отношении один ко многим. Я пытаюсь найти хорошую функцию запроса, чтобы я мог вернуть каждую строку в таблице A с вложенным массивом для всех связанных строк из таблицы B.

SELECT a.id AS id,a.name as name,b.id AS b_id,b.name AS b_name FROM a,b WHERE a.id=b.eid;

вернет только один результат

SELECT 
    a.id AS id,
    a.name as name,
    GROUP_CONCAT(b.id) AS b_id,
    GROUP_CONCAT(b.name) AS b_name 
FROM a,b 
WHERE a.id = b.eid;

тогда как это возвращает то, что я хочу, но я после массива, а не строки (в b.name могут быть запятые)

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 02 ноября 2010

Невозможно вернуть что-либо, кроме типа данных MySQL, поэтому краткий ответ: нет, вы не можете вернуть массив (вложенный или другой) результатов из подзапроса. Вы также увидите несколько довольно резких падений производительности, пытающихся построить объединенные строковые значения из сторонних, порядок подстрок будет неявным и, как вы уже упоминали, у вас будут проблемы с выбором подходящего разделителя.

Почти наверняка будет более эффективно использовать простое JOIN для создания единого набора результатов. Любые дубликаты на «одной» стороне отношения должны обрабатываться программно (что в любом случае предпочтительнее, чем обработка разбиения строк на несколько объединенных полей).

1 голос
/ 02 ноября 2010

Вы можете использовать разделитель, отличный от запятой:

GROUP_CONCAT(b.name SEPARATOR ';') AS b_name
...