PHP — создайте нормализованную таблицу ключевых слов

#php #many-to-many

#php #многие ко многим

Вопрос:

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

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

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

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

Любая помощь была бы высоко оценена.

Комментарии:

1. на самом деле это довольно просто. в чем проблема?

2. article_key (идентификатор статьи, ключевое слово), вероятно, должен быть article_key (идентификатор статьи, идентификатор ключевого слова)

Ответ №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)
}
  

Ответ №2:

Вы могли бы сделать что-то подобное этому:

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

В этом скрипте (не тестировался) Я предположил, что у вас уже есть ваша таблица keywords, заполненная ключевыми словами, и что ваша таблица article содержит разделенный запятыми список КЛЮЧЕВЫХ СЛОВ, а НЕ идентификаторы.

Комментарии:

1. Да, сначала мне пришлось заполнить таблицу ключевых слов. Сделав это, хотя ответ @ Jules был довольно близок к тому, что мне нужно. Большое спасибо!

Ответ №3:

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

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

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