PHP - 制作规范化的关键字表

时间:2011-10-18 16:04:19

标签: php many-to-many

我有一个带有文章(article_id,keyword)db表的mysql数据库,其中keywords是以逗号分隔的列表。我创建了两个新的空表:

关键字(keyword_id,keyword)其中每行只有一个关键字。

article_key (article_id,keyword_id)其中每行只有一个关键字。

因此,我希望从文章到关键字之间存在多对多的关系。我想创建一个简短的脚本来从原始的文章表中提取id和关键字,拆分关键字并适当地填充两个新表。我认为这很容易,但事实证明比我想象的要复杂一点。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

在伪代码中:

$keywords = "kw1,kw2,kw3,...";
foreach(explode(',', $keywords) as $kw) {
   INSERT IGNORE keywords (keyword) VALUES ('$kw')
   $id = mysql_insert_id();
   INSERT INTO article_key (article_id, keyword) VALUES ($aID, $id)
}

答案 1 :(得分:0)

不太确定您的问题是什么,我假设您article_key表示keyword_id而不是keyword

获取文章的关键字(给定article_id):

SELECT keywords.keyword 
FROM keywords
    INNER JOIN article_key ON keywords.keyword_id = article_key.keyword_id 
WHERE article_id = ?

要获取与关键字相关联的文章(给定keyword_id):

SELECT article_id
FROM article_keys 
    INNER JOIN keywords ON keywords.keyword_id = article_key.keyword_id
WHERE keyword = ?

修改

错过了你的实际问题,只是看到了它。 Marc B的回答如下:

答案 2 :(得分:0)

你可以做类似的事情:

//Get articles with keywords:
$result = mysql_query("SELECT article_id, keyword FROM article");

//Cycle through all articles
while ($article = mysql_fetch_assoc($result)) {
     $article_id = $article['article_id'];
     $keywords = $article['keyword'];
     //Explode keywords on seperator (; in this case)
     $keyword_array = explode(";", $keywords);

     //For each keyword get the corresponding ID
     for ($i = 0; $i < count($keyword_array); i++) {
          $result2 = mysql_query("SELECT keyword_id FROM keywords WHERE keyword = '" . $keyword_array[$i] . "'");
          //Get keyword_id
          $row = mysql_fetch_assoc($result2);
          $keyword_id = $row['keyword_id'];

          //Insert new key
          mysql_query("INSERT INTO article_key VALUES (" . $article_id . ", " . $keyword_id . ")");
     }
}

在此脚本(未经测试)中,我假设您已经在关键字表中填充了关键字,并且文章表中包含逗号分隔的关键字 ID。