在一个SELECT中获取数据(N - N关系)并将其作为标题+列数据呈现

时间:2011-08-08 12:58:45

标签: php sql

假设我有一个包含文章的表(article_id,article_name)和另一个包含订购文章的人名(person_id,person_name)的表。加上一个中间表,比如文章 - 人(article_id,person_id)。

有没有一种优雅的方式我可以做一个SELECT来获取所有文章和相关的购买者,这样文章将在标题中列出,人们列在他们购买的相应文章下?

此外,是否有一个SELECT可以获取所需的信息,但避免这样的结果(看起来像一个结构糟糕的数据库):

  • article_id:1,article_name:penlight,purchaser_id:1,buyerser_name:fred
  • article_id:1,article_name:penlight,purchaser_id:2,buyerser_name:albert
  • article_id:1,article_name:penlight,purchaser_id:3,buyerser_name:sonia
  • ...

2 个答案:

答案 0 :(得分:2)

这样的审美或显示要求应该在您的应用程序层处理,而不是在数据库层处理。

可以让DB返回无关联的行,但不建议这样做。您基本上要求的是返回没有关系信息的数据,这可能会导致问题。

返回所需数据更好,然后相应地过滤显示。 SQL没有针对这样的工作进行优化,在数据库级别格式化显示比在应用程序级别格式化要慢得多,而且要麻烦得多。

答案 1 :(得分:2)

这应该打印出带有值的行。

   $res = mssql_query('SELECT *
        FROM articles a
        join articles-people ap on a.article_id=ap.articleid
        join people p on ap.person_id=p.personid');

    $results = array();
    $finalResuls = array();
    while($row = mssql_fetch_assoc($res))
    {
       $results[] = $row;
    }

    foreach($results as $result)
    {
       /* This makes an array with key:value pairs as string. */
       foreach($result as $k => $v)
       {
          $finalResults[] = $k . ': ' . $v;
       }
       $string = '';
       /* Will concatenate data for each result row into a single string */
       foreach($result as $k => $v)
       {
          $string .= $k . ': ' . $v;
       }
       $finalResults[] = $string;
    }

因此,您可以在同一篇文章中同时拥有这两个解决方案,这是您与JNK讨论的解决方案。

$res = mssql_query('SELECT * from article');

$results = array();
while($row = mssql_fetch_assoc($res))
{
   $id = $row['article_id'];
   $res2 = mssql_query("SELECT * from people p join articles-people ap on p.person_id=ap.person_id where ap.article_id='$id'");
   while($row2 = mssql_fetch_assoc($res2))
   {
      foreach($row2 as $k => $v)
      {
         $results[$id][] = $k . ': ' . $v;
      }
   }
}