php + mysql:为每篇文章提取所有标签

时间:2012-06-11 14:19:43

标签: 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 WHERE item_id = ".$row->id);
               while ($row2 = $result2->fetch_object()) {
                      echo $row2 . '<br>';
                }
 }

当我尝试进行连接时,我会将每篇文章显示在3-4行中。

这看起来真的不干净。有没有更优雅的方法来提取每篇文章的标签?我很乐意听到存储数据的不同方式,我刚刚启动了项目......

2 个答案:

答案 0 :(得分:0)

你可以尝试SELECT DISTINCT itemID FROM items LIMIT 0,24

每个itemID只返回一个结果

答案 1 :(得分:0)

良好的做法是加入这两个表,但因为从理论上讲,一篇文章可以有很多标签,这会产生一些开销。

所以在这种情况下,你能做的最好的是; 将第一个查询的结果存储在关联数组中,其中键是项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();
    }

在此迭代之后,您执行第二个查询,但在所有项ID上都有一个选择器:

    $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次查询即可填充完整的多维数组。