我需要显示一篇文章列表,其中包含每篇文章对应的完整标签集。我试图做这个查询:
SELECT articles.article_id, `title`, `text`, tags.tag_name
FROM `articles`
LEFT JOIN `tags`
on articles.article_id = tags.article_id
WHERE articles.author_id = 150342
但是,对于每个标记,该查询会从表articles
返回相同的行,与标记一样多次。
像这样:
Array
(
[0] => Array
(
[article_id] => 1
[title] => title1
[text] => text1
[tag_name] => tag1
)
[1] => Array
(
[article_id] => 1
[title] => title1
[text] => text1
[tag_name] => tag2
)
[2] => Array
(
[article_id] => 1
[title] => title1
[text] => text1
[tag_name] => tag3
)
)
有没有办法在每个文章的数组中返回tag_name?看起来像这样:
Array
(
[0] => Array
(
[article_id] => 1
[title] => title1
[text] => text1
[tag_name] => array ([0] => tag1, [1] => tag2, [2] => tag3)
)
)
答案 0 :(得分:2)
不是数组,但你可以用逗号分隔字符串,
SELECT articles.article_id, `title`, `text`, GROUP_CONCAT(tags.tag_name )as tg_name
FROM `articles`
LEFT JOIN `tags`
on articles.article_id = tags.article_id
WHERE articles.author_id = 150342
GROUP BY tags.article_id
答案 1 :(得分:1)
不,你应该做两个查询,或者在php中以不同的方式处理/解析数据。
<强>像:强>
$articles = array();
foreach($query_result as $row) {
if (!array_key_exists($row['article_id'], $articles))
$articles[$row['article_id']] = array(
"title" => $row["title"],
"text" => $row["text"],
// etc
"tags" => array()
);
$articles[$row['article_id']]['tags'][] = $row["tag_name"];
}
答案 2 :(得分:1)
首先从查询中获取结果,然后将'tag_name'从string转换为Array:
SELECT A.article_id, A.`title`, A.`text`, group_concat(T.tag_name) a 'tag_name'
FROM `articles` A
LEFT JOIN `tags` T
on A.article_id = T.article_id
WHERE A.author_id = 150342
group by A.article_id, A.`title`, A.`text`
示例:
<?php
// Example 1
$tag_name = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
?>
答案 3 :(得分:1)
mySQL中没有数组的概念,但你可以将它们作为每个artical id的逗号分隔的tag_names列表
SELECT articles.article_id, `title`, `text`, GROUP_CONCAT(tags.tag_name) as tag_names
FROM `articles` LEFT JOIN `tags`
on articles.article_id = tags.article_id
WHERE articles.author_id = 150342
GROUP BY articles.article_id