【问题标题】:php+mysql: extracting all tags for each articlephp+mysql:提取每篇文章的所有标签
【发布时间】:2012-06-11 22:33:22
【问题描述】:

我正在尝试显示最后 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 行中。

这似乎真的不干净。有没有更优雅的方法来提取每篇文章的标签?我也乐于了解存储数据的不同方式,我刚刚开始了这个项目......

【问题讨论】:

  • 加入并使用“group by”
  • 但是 group by 只给了我一个标签

标签: php mysql


【解决方案1】:

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

每个 itemID 只会返回一个结果

【讨论】:

    【解决方案2】:

    最好的做法是连接两个表,但理论上一篇文章可以有很多标签,这会产生一些开销。

    所以在这种情况下,你能做的最好的就是; 将第一个查询的结果存储在关联数组中,其中键是项目 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 个查询即可填充完整的多维数组。

    【讨论】:

    • 问题是我正在显示文章,所以我想在第一次迭代中找到所有标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多