php - 如何在这种情况下高效编写mysql更新?

时间:2011-04-03 12:57:30

标签: php mysql insert-update

我想让我的数据库文章重新分类。我没有更好的分类文章更好。我构建了一个引用表,将每个类别的每个可能的单词放在其中。 然后我从主表articles查询,将每篇文章内容翻译成单词并将它们放入参考表中以匹配文章属于哪个类别?然后做一个更新。 我希望控制每个类别都有最多的文章是5.我写了一些这样的代码。

<?php
header('Content-type:text/html; charset=utf-8');
$db = mysql_connect("localhost","root","root") or die("can not connect Mysql Server");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT content,id,directory,date FROM articles WHERE Order By date DESC");//get all the articles from database
while ($row = mysql_fetch_array($result))
{
$id = $row['id'];
$content = $row['content'];
$words = preg_split("/\s+/",$content); 
$uniqueWords = array_keys(array_flip($words)); 
$parts = '';
foreach($uniqueWords as $word){     
$parts[] = " tag1 = '$word' OR tag2 = '$word' OR tag3 = '$word' OR tag4 = '$word' OR tag5 = '$word' ";   
$where = implode(" OR ", $parts);
mysql_select_db("mydb",$db);
mysql_query("SET NAMES utf8");
$query = mysql_query("SELECT * FROM tags1 WHERE ($where) AND category='art' "); // put every word from each article into `tag1` database whether the article is match category='art'
$citn = '';
            while ($row = mysql_fetch_array($query)) {
        $citn = $row['category'];
        } 
    $catnew = $citn;
mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5"); // update first 5 articles which is match category='art' 
$query = mysql_query("SELECT * FROM tags1 WHERE ($where) AND category='fashion' "); // put every word from each article into `tag1` database whether the article is match category='fashion'
$citn = '';
            while ($row = mysql_fetch_array($query)) {
        $citn .= $row['category']."|" ;
        } 
    $catnew = explode("|",$citn);
mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5"); // update first 5 articles which is match category='fashion'
$query = mysql_query("SELECT * FROM tags1 WHERE ($where) AND category='travel' ");// put every word from each article into `tag1` database whether the article is match category='travel'
... // there have 20 `category`, each is the same judge method.
}
}
mysql_close($db);
?>

但是速度非常慢,我在我的文章db表中测试了60篇文章,在tag1表中测试了20个类别。但在更新期间,它将回显Fatal error: Maximum execution time of 60 seconds exceeded in...

如何进行有效的更新或者有更好的方法来完成这项工作吗?感谢。

这是我的文章表

id | title | link | content | date | directory
1  | ...   | ...  | ...     | ...  |  0 // all directory value are `0` 
2  | ...   | ...  | ...     | ...  |  0 
3  | ...   | ...  | ...     | ...  |  0
... // more 60 articles

这是我的tag1表

category | tag1    | tag2   | tag3       | tag4    |  tag5   
tourism  | tourism | travel | tour       | journey |  trip
fashion  | style   | vogue  | fashion    | mode    |  Popular
art      | paint   |
... // more 20 categories

1 个答案:

答案 0 :(得分:0)

原谅我,我觉得我必须把你的代码读错了,因为我读了很多关于你的代码的问题让我很困惑。

首先,您有许多方面,例如:

  while ($row = mysql_fetch_array($query)) {
$citn = $row['category'];
} 

当然,当运行时只会显示$ citn中的最后一个条目,但是在你的where子句中你指定的类别必须是'art',例如,结果是,查询的重点是什么,你已经知道了答案是'艺术'?除非这是简化代码。

所以,我想知道你认为你的代码做了什么,据我所知,第一个'艺术'将返回$ citn作为'art',第二个将返回“fashion | fashion ..”它找到的tags1表中的行,最后一次更新可能会失败,如果它超过1个时尚,将其爆炸成数组我不知道SQL将如何处理在那里转储的PHP数组。你没有显示任何代码的最后一个查询,所以..我有点迷失。

我得到了您想要展开给定文章文本的印象,然后看看它是否出现在cateogry中的5个或更多标签。如果是这样,我不会看到这样的代码。

正如我所说,我可能会以某种方式误读它。