0

我有这样的桌子:

post:
+----------------+-----------+
| article_id     | tags      | 
+----------------+-----------+
| 1              |  x1,x2,x3| 
| 2              |  x1,x4,x5 | 
+----------------+-----------+

我想要做的是规范化它,所以我创建了另外 2 个表:

tags:
+----------------+-----------+
| tag_id         | tag_name  | 
+----------------+-----------+
| 1              |    x1     | 
| 2              |    x2     | 
| 3              |    x3     |
+----------------+-----------+

post_tag:
+----------------+-----------+
| id_post         | id_tag  | 
+----------------+-----------+
| 1              |    1     | 
| 1              |    2     | 
| 2              |    1     |
+----------------+-----------+

我已经将所有标签从 post 表导出到 tags 表,现在每个标签在 tags 表中都有自己的 id,但是当我在考虑如何使用 post_tag 表时我很困惑?

编辑:questin 是如何填充 post_tag 表,查询会是什么样子?

像这样试过

$sql=mysql_query("SELECT * FROM post"); 
    while($row=mysql_fetch_array($sql)) {
        $article_id=$row['article_id'];
  $all_tags =$row['tags'];      
  $tags= explode(",",$all_tags);                                
    foreach($all_tags as $tag) {
     $sql2=mysql_query("SELECT * FROM tags WHERE tag_name = '$tag'");
      while($row=mysql_fetch_array($sql2)) {                               $tag_id=$row['tag_id'];                                  $q = "INSERT INTO post_tag (id_post, id_tag) VALUE ('$article_id', $tag_id')";
        $r = mysql_query($q);
      }
    }
}

但它没有写完整的 post_tag 表

4

4 回答 4

1

对于帖子的每个标签,您在 post_tag 表中插入一个条目。这称为 m 对 n 关系。去谷歌上查询 ;)

  • post_id:1,tag_id:1
  • post_id:1,tag_id:2
  • post_id:1,tag_id:3

邮政

  • post_id

标签

  • tag_id
  • 标签名称

post_tag

  • post_id
  • tag_id
于 2012-09-07T13:13:54.653 回答
1

我明白了,你想用一个 sql-query 来解决你的问题,但这并不方便。尝试使用 php-power ,你会成功的。

php方式。1.创建表tagsposts_tags(就像你在问题中描述的那样)。2. 在 php 中从当前post表中获取所有行并循环它:

foreach($query_results as $row) {
  $article_id = $row['article_id];
  $tags = explode('|', $row['tags']);
  foreach($tags as $tag) {
    // here check if this tag exists in your new `tags` table (by tag's name). If it is, save its id in $tag_id variable.
    // if a tag don't exists then insert it. And put its new id (mysql returns it after inserting) into $tag_id.
    // After that add a row ($article_id, $tag_id) to table `posts_tags`
  }
}

tags然后从旧表中删除列post。利润!

tagsps 在表中的标签名称和表中的对 (article_id, tag_id) 上创建唯一索引posts_tags

于 2012-09-10T12:58:25.953 回答
1

也许这个会起作用?

$sql= mysql_query("SELECT * FROM post"); 
while($row=mysql_fetch_array($sql)) {
    $article_id=$row['article_id'];
    $all_tags = $row['tags'];      
    $tags = explode(",",$all_tags);              
    foreach($all_tags as $tag_title) {
        $tag_id = null;
        $tag=mysql_fetch_assoc(mysql_query('SELECT * FROM tags WHERE tag_name = "'.$tag_title.'"'));
        if ($tag) {
            $tag_id = $tag['tag_id']; 
        } else {
            mysql_query('INSERT INTO tags SET tag_name = "'.$tag_title.'"');
            $tag_id = mysql_insert_id();
        } 
        $q = "INSERT INTO post_tag (id_post, id_tag) VALUE ('$article_id', $tag_id')";
        $r = mysql_query($q);
    }
}

运行循环后,您需要删除表中的旧post

于 2012-09-10T14:33:46.543 回答
0

假设您有一个名为 的帖子my cat!,它的 id 为1。您希望向其中添加cats标签home

您应该首先在标签表中创建标签catshome如果它们尚不存在)。假设他们是cats | 2home | 4(数字是他们的 id)。

然后,您需要在 post_tag 表中存储值1 | 21 | 4,其中第一个值是帖子的 id,第二个值是标签的 id。

要查找帖子编号 1 的标签,您需要类似

SELECT Tags.name FROM Tags, Tags_Posts WHERE Tags_Posts.post_id = 1 AND Tags.id = Tags_Posts.tag_id

于 2012-09-07T13:22:10.210 回答