php+mysql:提取每篇文章的所有标记

php+mysql:提取每篇文章的所有标记,php,mysql,Php,Mysql,我试图显示最后20篇文章,以及它们各自的标签,每篇文章大约有3-4个标签。我有一个文章表和一个标签表,每一篇文章都有3-4行带有文章id的标签 我所知道的是: $result = $mysqli->query("SELECT * FROM items LIMIT 0,24 "); while ($row = $result->fetch_object()) { $result2 = $mysqli->query("SELECT tag FROM tags WHE

我试图显示最后20篇文章,以及它们各自的标签,每篇文章大约有3-4个标签。我有一个文章表和一个标签表,每一篇文章都有3-4行带有文章id的标签

我所知道的是:

$result = $mysqli->query("SELECT * FROM items  LIMIT 0,24 ");
while ($row = $result->fetch_object()) {
       $result2 = $mysqli->query("SELECT tag FROM tags WHERE item_id = ".$row->id);
               while ($row2 = $result2->fetch_object()) {
                      echo $row2 . '<br>';
                }
 }
当我尝试加入时,我会让每篇文章显示在3-4行中


这看起来真的不干净。是否有一种更优雅的方法来提取每篇文章的标签?我也很乐意听到存储数据的不同方法,我刚开始项目…

您可以尝试从items LIMIT 0,24中选择不同的itemID


每个itemID只返回一个结果。好的做法是连接两个表,但从理论上讲,一篇文章可以有许多标记,这会产生一些开销

所以在这种情况下,你能做的就是; 将第一次查询的结果存储在关联数组中,其中键是项ID:

    $items = array();
    $result = $mysqli->query("SELECT * FROM items  LIMIT 0,24 ");
    while ($row = $result->fetch_object()) {
      $items[$row->item_id] = $row;
      $items[$row->item_id]->tags = array();
    }
    $result2 = $mysqli->query("SELECT item_id, tag FROM tags WHERE item_id IN (".implode(',', array_keys($items)).")");

    while ($row2 = $result2->fetch_object()) {
      $items[$row2->item_id]->tags[] = $row2->tag;
    }
在此迭代之后,执行第二个查询,但在所有项目ID上使用选择器:

    $items = array();
    $result = $mysqli->query("SELECT * FROM items  LIMIT 0,24 ");
    while ($row = $result->fetch_object()) {
      $items[$row->item_id] = $row;
      $items[$row->item_id]->tags = array();
    }
    $result2 = $mysqli->query("SELECT item_id, tag FROM tags WHERE item_id IN (".implode(',', array_keys($items)).")");

    while ($row2 = $result2->fetch_object()) {
      $items[$row2->item_id]->tags[] = $row2->tag;
    }

这样,只需2个查询就可以填充完整的多维数组。

创建一个联接并使用group by,但group by只会给我一个标记。因为我正在显示文章,所以我希望在第一次迭代中找到所有标记