2014-11-10 7 views
2

У меня есть следующий SQLSQL присоединиться и сгруппировать элементы как массив

SELECT articles.id, articles.title, tags.name AS tags 
FROM articles 
LEFT JOIN article_tag_association ON articles.id = article_tag_association.article_id 
LEFT JOIN tags ON tags.id = article_tag_association.tag_id 

Это хорошо работает, за исключением того, что создает строку для каждого тега статья имеет, что Messes с пределом

например

[ 
"0" => ["id" => "1", "title" => "test", "tags" => "tag1"], 
"1" => ["id" => "1", "title" => "test", "tags" => "tag2"], 
"2" => ["id" => "2", "title" => "test2", "tags" => "tag1"], 
] 

(всего 2 статьи, но три ряда)

есть способ сделать это вернуть каждую статью с массивом тегов?

что-то вроде:

[ 
"0" => ["id" => "1", "title" => "test", "tags" => ["tag1", "tag2"]], 
"1" => ["id" => "2", "title" => "test2", "tags" => ["tag1"]], 
] 
+0

Вы можете разместить свое создание стола? может быть проще создать строковый формат «array» –

ответ

3

по умолчанию вы не можете вернуть массив. но вы можете украсить/объединить ваши столбцы, чтобы создать массив вроде строки. если это хорошая идея? зависит от вашей ситуации. Также следует помнить, MySQL имеет некоторые ограничения для GROUP_CONCAT (только возвращающие 1024 * символов)

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

SELECT 
    concat(
    '[', 
    concat('ID => "', articles.id,'"'), 
    concat('Title => "', articles.title,'"'), 
    concat('Tags => [', GROUP_CONCAT(concat('"',tags.name, '"')), ']'), 
    ']' 
    ) as Array_String 
FROM 
    articles 
     LEFT JOIN 
    article_tag_association ON articles.id = article_tag_association.article_id 
     LEFT JOIN 
    tags ON tags.id = article_tag_association.tag_id 
GROUP BY articles.id 

это даст вам каждую строку как массив, если вы хотите, чтобы все в одной строке помещало их под группу group_concat.

примечание: если ваш результат больше, чем 1024 голец вы должны использовать

SET group_concat_max_len = 1000000; >> size of your string length 

PS: не тестировал выше кода. test it :)

1
SELECT articles.id, articles.title, GROUP_CONCAT(tags.name) AS tags 
FROM articles 
LEFT JOIN article_tag_association ON articles.id = article_tag_association.article_id 
LEFT JOIN tags ON tags.id = article_tag_association.tag_id 
GROUP BY articles.id 

Вы не можете вернуть массив в MySQL, но вы можете получить эту сцепленную строку и разделить его в массив на PHP стороне. Вы можете выбрать символ, используемый для «клея», на GROUP_CONCAT(name SEPARATOR '#') для одного, который не должен отображаться ни в одном имени и, следовательно, быть безопасным для разделения на массив.

+0

, это не вернет «массив», а просто конкатенированную строку для тегов ... –

+1

@ RaphaëlAlthaus SQL не имеет понятия о массиве. –

+0

Вы не можете вернуть массив в mysql, но вы можете получить эту конкатенированную строку и разделить ее на массив на стороне PHP – David162795

Смежные вопросы