PHP - создать нормализованную таблицу ключевых слов - PullRequest
2 голосов
/ 18 октября 2011

У меня есть база данных mysql с таблицей article (article_id, keyword), где ключевые слова - это список, разделенный запятыми. Я создал две новые пустые таблицы:

ключевых слов (keyword_id, ключевое слово), где в каждой строке есть только одно ключевое слово.

article_key (article_id, keyword_id), где в каждой строке есть только одно ключевое слово.

Таким образом, я хочу иметь отношение «многие ко многим», от статей до ключевых слов. Я хотел создать короткий скрипт, чтобы извлечь идентификатор и ключевые слова из исходной таблицы article , разделить ключевые слова и заполнить две новые таблицы соответствующим образом. Я предполагал, что это будет легко, но оказалось немного сложнее, чем я думал.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 18 октября 2011

В псевдокоде:

$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)
}
0 голосов
/ 18 октября 2011

Вы можете сделать что-то похожее на это:

//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 . ")");
     }
}

В этом сценарии (не тестировался) я предполагал, что у вас уже есть таблица ключевых слов , заполненная ключевыми словами, и что ваша таблица article содержит разделенный запятыми список KEYWORDS и НЕ идентификаторы.

0 голосов
/ 18 октября 2011

Не совсем уверен, что ваш вопрос, и я предполагаю, что в 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 = ?

Чтобы получить статьи, с которыми связано ключевое слово (учитывая ключевое слово_id):

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

Редактировать

Пропустил ваш фактический вопрос, просто видел его, хотя. Ниже приведен хороший ответ Марка Б.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...