Как эффективно писать обновления MySQL в этой ситуации? - PullRequest
0 голосов
/ 03 апреля 2011

Я хочу, чтобы мою статью базы данных переклассифицировали.Я не имею никакой идеи лучше классифицировать статьи.Я строю справочную таблицу, вставляю в нее, возможно, все слова каждой категории.затем я запрашиваю из основной таблицы 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);
?>

но скорость очень и очень низкая, я тестирую 60 статей в моей таблице дБ статей, 20 категорий в таблице tag1.Но во время обновления будет отображаться 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 голосов
/ 03 апреля 2011

Простите, я чувствую, что, должно быть, я неправильно прочитал ваш код, так как, когда я читал его, меня озадачили несколько вопросов о вашем коде.

Во-первых, у вас есть несколько областей, таких как:

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

, который, при запуске, конечно, покажет только последнюю запись в $ citn, но в предложении where вы указываете, что категория должна быть 'art', например, как результат, в чем смыслвопрос, вы уже знали, что ответ «искусство»?Если только это не упрощенный код.

Итак, мне интересно, что, по вашему мнению, делает ваш код, насколько я могу судить, первый для 'art' вернет $ citn как 'art', а второй вернётся«fashion | fashion ..» для каждой строки в таблице tags1, которую он находит, последнее обновление, вероятно, завершится неудачей, если существует более 1 мода, так как он разбивается на массив. Я не уверен, как SQL будет обрабатывать массив PHP, выгруженный втам.Последний запрос, для которого вы не показываете какой-либо код, так что ... Я немного растерялся.

У меня сложилось впечатление, что вы хотели взорвать текст данной статьи, а затем посмотреть, появилось ли 5 ​​или более тегов.в категрии.Если так, я не вижу, чтобы этот код делал это.

Как я уже сказал, я мог как-то неправильно это понять.

...