2010-11-01 2 views
0

В гипотетическом сценарии, где у меня есть пара таблиц базы данных, в отношениях от одного до многих. Я пытаюсь найти хорошую функцию запроса, так что я могу вернуть каждую строку в таблице А с вложенным массивом для всех связанных строк из таблицы 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)

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

+0

Что такое связанный ключ? является ли внешний ключ? – Stephen

+0

thats хороший ключ, связанный с точкой, был бы чем-то другим - b.eid, я обновил это в предыдущем запросе – kalpaitch

+0

не могли бы вы быть более точными, что бы хотело выполнить ... как я понимаю, вы должны использовать explode()? – Breezer

ответ

1

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

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

Да, отлично, приветствия, просто подумал об этом. Из любопытства, если нельзя гарантировать, что любой символ или комбинация символов не будет в значении b_name. Существуют ли какие-либо другие методы? – kalpaitch

+0

хорошо, вы могли бы использовать очень длинный и случайный разделитель, они все равно исчезнут, как только вы взорвете его, сделайте это 3 знака длинным, и я сомневаюсь, что они когда-либо путаются с обычным текстом хороший сепаратор «# & £» = D – Breezer

+0

You может избежать существующего разделителя char с другим разделителем char: 'GROUP_CONCAT (REPLACE (b.name, ';', ';;') SEPARATOR ';') AS b_name', но это требует также специальной обработки при использовании данных. –

1

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

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