Главная » Создание сайта, раскрутка сайта

Получение записей с таким полем из одной таблицы, которых нет в поле другой таблице

Итак, объясню более детально поставленную задачу, которую необходимо решить. Имеются две базы данных, в одном из которых имеются записи, ключевым полем(хотя это не важно, поле может быть любым) которого является ID. Есть вторая таблица, у которого одно из полей содержит те же ID. Задача состоит в том, чтобы вывести все записи из второй таблицы, в котором в одной из поле имеется такое значение ID, которое отсутствует в соответствующем поле первой таблицы.

Переходя на частный случай, хочется расписать, что во время работы с базой данных над решением одного вопроса, было замечено, что в таблице wp_postmeta, в которой хранятся значения дополнительных полей для каждой записи и которые для опознания имеют поле post_id, где указывается id поста, к которому относятся данные дополнительные поля, имеются такие записи, у которых указаны id несуществующих записей. При этом опытным путем было выяснено, что, возможно, эти записи использовались прежде, до смены id поста, что произошло по непонятной на данный момент причине. После смены id, в таблице wp_postmeta все дополнительные поля были продублированы, благодаря чему работоспособность сайта никак не пострадала. Но в таблице осталось огромное количество никому ненужных записей, от которых можно и нужно избавляться.

Поэтому, чтобы из таблицы wp_postmeta получить все записи, в которых поле post_id такое, которого нет в поле ID в таблице wp_posts, необходимо использовать следующий SQL запрос.

select DISTINCT wp_postmeta.post_id from wp_postmeta left join wp_posts on wp_postmeta.post_id = wp_posts.ID where wp_posts.ID is null order by wp_postmeta.post_id

К сожалению запрос не выводит записи в таком виде, где их можно выделить с помощью интерфейса PhpMyAdmin и далее удалить их нажатием одной кнопки. Поэтому были использованы костыльные методы(не хотелось использовать сразу DELETE, так как была боязнь того, что удаление может повлечь за собой фатальные последствия, пусть и наличие бэкапа позволяло все вернуть на свои места). Поэтому выдача вышеописанного SQL запроса была экспортирована в обычный файл doc. Так как для пакетного(массового) удаления записей с помощью запроса DELETE необходим следующий запрос(подогнан для нашего случая):

DELETE FROM `wp_postmeta` WHERE post_id IN (12, 15, 19, 1649, 12346)

Как видите, нам просто нужно получить все отсутствующие id-шники и вставить их в этот запрос, предварительно разделив запятыми(кроме последнего). Но ставить запятые самому — дело трудоемкое, поэтому пошли на хитрость. В выводе предыдущей команды добавляете вывод заведомо пустого поля(например, wp_posts.post_title — оно пустое и принимает значение NULL, так как по нашему условия записи с таким id просто не существует). Далее все это дело экспортируете в WORD, заменяете Null везде на запятую, копируете полученное дело и вставляете в запрос на удаление.

Конечно же, метод невероятно костыльный. Но когда знаний не хватает, помогает логика и сообразительность, благодаря которой можно из многих завалов выбраться. Хочется отметить, что удалив таким образом бесполезные записи, объем таблицы wp_postmeta был уменьшен с 90+МБ до 30+ МБ. Число же записей в таблице было уменьшено с 1 100 000+ записей до 300 000+ записей. Вот такая вот оптимизация базы данных WordPress.

Один комментарий к записи “Получение записей с таким полем из одной таблицы, которых нет в поле другой таблице
  1. Любовь в cказал :

    Запрос на выборку — это объект базы данных, который служит для отображения данных в режим таблицы. Запрос может получать данные из одной или нескольких таблиц, из существующих запросов или из комбинаций таблиц и запросов. Таблицы или запросы, используемые для получения данных, называются источниками записей.

Добавить комментарий

Ваш комментарий появится после модерации.