SQL连接和组项目作为数组

时间:2014-11-10 15:20:00

标签: mysql sql join

我有以下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"]],
]

2 个答案:

答案 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 '#')用于'粘合'的字符,用于不应出现在任何名称中的字符,因此可以安全地拆分到数组中。