我有以下SQL
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
这可以正常工作,除了它为文章的每个标签创建一行,其中包含限制
e.g。
[
"0" => ["id" => "1", "title" => "test", "tags" => "tag1"],
"1" => ["id" => "1", "title" => "test", "tags" => "tag2"],
"2" => ["id" => "2", "title" => "test2", "tags" => "tag1"],
]
(只有2篇文章,但有3行)
有没有办法让每个文章都返回一个标签数组?
类似的东西:
[
"0" => ["id" => "1", "title" => "test", "tags" => ["tag1", "tag2"]],
"1" => ["id" => "2", "title" => "test2", "tags" => ["tag1"]],
]
答案 0 :(得分:5)
默认情况下,您无法返回数组。但是你可以装饰/连接你的列以产生一个像字符串一样的数组。如果这是一个好主意?取决于你的情况。另请注意,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:尚未测试上述代码。测试它:))
答案 1 :(得分:2)
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 '#')
用于'粘合'的字符,用于不应出现在任何名称中的字符,因此可以安全地拆分到数组中。