#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 = ?
Редактировать
Пропустил ваш актуальный вопрос, хотя только что его увидел. Приведенный ниже ответ Марка Б. хороший.