SQL-Query PHP -Blog

时间:2015-11-13 11:13:07

标签: php mysql

我确信在网络的某个地方这个问题已被提出但我还没有找到它,因为我不知道究竟应该搜索什么。所以我将尝试描述这个问题:

我有一个用PHP编写的博客和一个SQL数据库,我收到了所需的数据。

每个博客条目包含1个图像和1个文本字段,并具有自己的ID。 为了获得这些数据,我执行此查询(伪代码) - >这很好用:

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image
                    FROM news 
                    LEFT OUTER JOIN news_text ON news.id=news_text.id
                    LEFT OUTER JOIN news_images ON news_images.id = news.id 
                    ORDER BY position") as $row){
                                                echo "{$row['id']}";
                                                echo "{$row['position']}";
                                                echo "{$row['date']}";
                                                echo "{$row['text']}";
                                                echo "{$row['image']}"; 
                                                }

现在问题开始了。我想添加一个注释字段,用户可以在其中添加消息。因此,对于每个博客条目,可以有几条评论(可能是1:n连接)。 - 我试图在foreach循环中添加一个foreach循环(愚蠢) - 我尝试了几个SQL查询,但结果只是垃圾 - 我没有看到如何将数据库news_comment与其他人连接的逻辑

这是我的简化数据库:

Signup and API Keys

有人能给我一个暗示我怎么能解决这个问题。结果应该是:

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image
                    FROM news 
                    LEFT OUTER JOIN news_text ON news.id=news_text.id
                    LEFT OUTER JOIN news_images ON news_images.id = news.id 
                    ORDER BY position") as $row){
                                                echo "{$row['id']}";
                                                echo "{$row['position']}";
                                                echo "{$row['date']}";
                                                echo "{$row['text']}";
                                                echo "{$row['image']}"; 
           Here i get for each blog-entry the corresponding comments..            
                                                }

谢谢。 米施

2 个答案:

答案 0 :(得分:1)

您应该使用与检索新闻相同的条件在另一个查询(不在循环中)中检索注释。因此,在执行两个查询之后,您将需要数组:新闻和评论。

然后你只需对每个新闻项目采取适当的评论 为此,您可能需要重建comments数组,以便注释news_id将是存储注释的数组的索引。

最后它看起来像这样:

$news = [
    [
        'id' => ...,
        'position' => ...
        <so on>
    ]
];

$comments = [
    $news[0]['id'] = [<comment array>],
    <so on>
];

这是大多数框架用于在结果集中绑定数据的方式。

答案 1 :(得分:1)

在Alex(thx)和MulipleIterator的帮助下解决了这个问题。这就是它对我有用的方式(也许有人有更好的解决方案)。

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image
FROM news 
LEFT OUTER JOIN news_text ON news.id=news_text.id
LEFT OUTER JOIN news_images ON news_images.id = news.id 
ORDER BY position") as $row)
  {
  $news_id[] = $row['id'];
  $news_text[] = $row['news_text'];
  $news_images[] = $row['news_images'];
  $values = new MultipleIterator();
  $values->attachIterator(new ArrayIterator($news_id));
  $values->attachIterator(new ArrayIterator($news_text));
  $values->attachIterator(new ArrayIterator($news_images));
  } 

foreach($values as $value) 
  {
  list($news_text, $news_images, $news_id) = $value; 
    {
    echo '$news_text';
    echo '$news_images';

    foreach($db->query("SELECT comment FROM news_comment WHERE id = $news_id ") as $row)
      {
      echo "{$row['comment']}";
      }
    }
  }