MySQL поиск и обновление на основе результатов из 2 таблиц - PullRequest
0 голосов
/ 15 февраля 2020

Прежде всего, обратите внимание, что на этот вопрос здесь нет ответа: MySQL обновить таблицу на основе другого значения таблицы или даже любого другого вопроса или ответа на стек, который я смог найти!

Я преобразовал форум на веб-сайте, и теперь мне просто нужно восстановить внутренние URL-ссылки в нескольких сотнях сообщений.

Сообщения находятся в столбце post_content в таблице xyz_posts

ID     post_content  

1467  This is great https://example.com/index.php?topic=1234 I really like it
1468  Hello world
1469  Take a look https://example.com/index.php?topic=5678.0

Вы можете видеть, что URL-адреса в основном скрыты в тексте сообщения , Обратите внимание, что приведенный выше пример иногда может быть записан с topic = 1234.0 в конце, хотя на самом деле он хранится в базе данных как значение 1234. Я не хочу переписывать URL-адрес и случайно сохранять .0

Вот пример того, как мне нужно, чтобы эта таблица выглядела:

ID     post_content  

1467  This is great https://example.com/finished-page/ I really like it
1468  Hello world
1469  Take a look https://example.com/another-page/

Итак, таблица xyz_converter отображает старый номер topi c на новый идентификатор сообщения, подобный следующему:

meta_key             meta_value     value_id  

_bbp_old_topic_id    1234           15675
_bbp_old_reply_id    1234           17439

Будьте здесь осторожны, число 1234 также существует в этой таблице для ответов на форумах, которые нам не нужны, но meta_key и value_id отличаются для тех, которые показаны. Этот SQL запрос работает для получения правильного ответа:

SELECT * FROM `xyz_converter` WHERE meta_key LIKE '_bbp_old_topic_id' AND `meta_value` LIKE '1234'

Также в таблице xyz_posts мы сопоставляем вышеупомянутый value_id с суффиксом URL поста, например:

ID        post_name

15675     finished-page 
15676     another-page 

Как создать запрос SQL, который обнаружит значение meta_value в одной таблице и затем заменит его на правильный окончательный URL-адрес, как упоминалось?

ОБЗОР ПРОЦЕССА

  1. Обнаружение URL в xyz_posts post_content
  2. Извлечение числа topi c из URL (например, 1234). Если это 1234.0, тогда возьмите всего 1234
  3. . Преобразуйте его в номер записи, найденный в xyz_converter value_id (например, 15675), убедившись, что он находится рядом с _bbp_old_topic_id
  4. Возьмите суффикс URL-адрес в xyz_posts имя_почты (например, «готовая страница»)
  5. Переписать исходный URL-адрес, включив суффикс (не забывая завершающие косые черты).

Я использую MySQL 5.7.29 и PHPMyAdmin . Я довольно новичок в SQL запросах и нубе Regex, но готов узнать больше!

1 Ответ

1 голос
/ 15 февраля 2020

Решение, которое использует только команды MySQL и работает в MySQL 5.7, может быть таким:

Если .0 присутствует только в URL, вы можете использовать такой запрос, чтобы удалить все вхождения .0 из post_content в xyz_posts.

UPDATE `xyz_posts` SET post_content=REPLACE(post_content,'.0 ',' ') WHERE post_content LIKE '%topic=%.0 %';

Тогда вы можете использовать

CREATE TABLE temp_tbl
SELECT CONCAT('index.php?topic=',c.meta_value) as `find_value` ,p.post_name as `replace_value`
FROM `xyz_converter` c
INNER JOIN `xyz_posts` p ON c.value_id=p.id AND `meta_key`='_bbp_old_topic_id'
ORDER BY meta_value DESC;

UPDATE `xyz_posts` p 
INNER JOIN  `temp_tbl` t ON p.post_content LIKE CONCAT('%',t.find_value,'%')
SET p.`post_content`=REPLACE(p.`post_content`,t.find_value,t.replace_value);

Первая команда создаст временную таблицу, в которой первый столбец будет значение, которое вы хотите найти и заменить, например index.php?topic=1234, а второй столбец будет значением, которое вы хотите заменить на finished-page

Вторая команда заменит posts_content в xyz_posts, принимая первый столбец из temp_tbl и замена его вторым столбцом.

Под скрипкой sql, где вы можете увидеть решение в действии

http://sqlfiddle.com/#! 9 / 7bce8 c

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

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