连接查询:如何将连接table2的结果作为table1中的数组返回

时间:2014-03-03 11:13:10

标签: php mysql sql join

我需要显示一篇文章列表,其中包含每篇文章对应的完整标签集。我试图做这个查询:

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)
 )
)

4 个答案:

答案 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