在MySQL上模拟多维数组

时间:2011-03-21 12:59:56

标签: php mysql arrays

我有两个具有这些结构的表:

文章:article_id,文字 标签:tag_id,article_id,text

如何使用一个查询选择所有文章和所有相关标签?据我所知,MySQL只能返回一个二维数组,因此我可以将一个解决方案连接到文章选择结果的列中。但是如何?

4 个答案:

答案 0 :(得分:3)

关系数据以元组形式组织。元组具有n维,并且可以使用单个关系(表)轻松地描述从m维向量到标量或k维值的函数映射。 (n = m + k)

如果您需要/建议只用于表示层,那么您可以执行Eric Hogue建议的操作,但如果这是在流程的中间或其他流程的开始,那么Fabrik的建议是正确的方法。

GROUP_CONCAT使数据非关系,因此更难以用作后续SQL处理的基础。因此,如果您的客户端层无法为您执行此操作,则此命令的目的是使输出成为可能。不要试图根据演示问题对核心关系进行建模。

答案 1 :(得分:1)

查看Group_Concat MySQL函数。你可以写点像

Select A.article_id, A.text GROUP_CONCAT(B.Text) As Tags 
From articles A 
Left Outer Join tags B Using (article_id) 
Group By A.article_id, A.Text

正如他在回答中提到的那样,只有当你想要显示数据时我才会使用它,因为你提到连接问题中的标签,我建议使用它。如果您需要使用日期,请使用fabrik建议的简单连接。

答案 2 :(得分:1)

SELECT * FROM articles LEFT JOIN tags ON article.article_id = tags.article_id

答案 3 :(得分:0)

如果按文章排序,则可以通过跳过与重复文章ID相关联的文章属性来创建数据的表示形式 - 或者只是覆盖它们:

// select a.article_id, a.text, b.tag_id, b.text as tag_text
// from articles a, tags b
// where a.article_id=b.article_id
$articles=array();
while ($r=mysql_fetch_assoc($result)) {
  $article[$r['article_id']=array(
       'text'=>$r['text'];
       );
  @if (!is_array($article[$r['article_id']]['tags'])) {
       $article[$r['article_id']]['tags']=array();
  }
  $article[$r['article_id']]['tags'][$r['tag_id']]=$r['tag_text'];
}