Как мне удалить записи из 1 таблицы на основе значения временной метки в другой таблице?

#php #mysql #mariadb

#php #mysql #mariadb

Вопрос:

Я пытаюсь создать некоторые php и sql для запланированной задачи, которая объединила бы 2 таблицы по значению и удалила бы все записи из table1 на основе значения временной метки unix в table2. Я пока что придумал следующий код, но не хочу его запускать, поскольку это может принести больше вреда, чем пользы. Кто-нибудь может помочь с этим? Заранее спасибо

 $sql = "DELETE FROM tbl_code
LEFT JOIN ( SELECT * FROM `tbl_ctoon` WHERE tbl_code.ctoon_id=tbl_ctoon.ctoon_id AND tbl_code.code_for='C')
WHERE DATEDIFF( date(NOW( )) , FROM_UNIXTIME(expire_date)) > 3 ";
$del = new database();
$del->myquery($sql, 1);
  

Таким образом, в конечном итоге это объединило бы 2 таблицы и удалило бы все записи из, tbl_code где expire_date in tbl_ctoon больше 3 дней.

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

1. обновите свой вопрос, добавьте четкий образец данных и ожидаемый результат..

2. WHERE expire_date < NOW() - INTERVAL 3 DAY

Ответ №1:

Перед удалением я бы проверил запрос с помощью select. Ваш запрос мог бы выглядеть проще:

 $sql = "SELECT * FROM tbl_code 
LEFT JOIN tbl_ctoon 
ON tbl_code.ctoon_id = tbl_ctoon.ctoon_id AND tbl_code.code_for = 'C' 
WHERE DATEDIFF(DATE(NOW()), FROM_UNIXTIME(expire_date)) > 3 AND tbl_ctoon.ctoon_id IS NOT NULL";
  

Затем, если ваш запрос возвращает записи, которые вы ожидаете удалить, выполните удаление:

 $sql = "DELETE FROM tbl_code 
LEFT JOIN tbl_ctoon 
ON tbl_code.ctoon_id = tbl_ctoon.ctoon_id AND tbl_code.code_for = 'C' 
WHERE DATEDIFF(DATE(NOW()), FROM_UNIXTIME(expire_date)) > 3 AND tbl_ctoon.ctoon_id IS NOT NULL";
  

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

1. Этот выбор сработал отлично! Я попробую удалить позже, чтобы убедиться, что из него удалены те же записи, которые были отображены в выборе. Спасибо!

2. Последний вопрос: когда я запускаю select, он отображает столбцы из обеих таблиц, где идентификатор совпадает. Когда я запускаю удаление, оно удаляет только строки из tbl_code на основе критериев, верно? Не обе таблицы, где критерии совпадают

3. Да, правильно, он удален только из одной таблицы. Чтобы иметь одну таблицу в select, вы можете сделать SELECT tbl_code.* FROM ...

4. Я попробовал скрипт прошлой ночью после резервного копирования обеих таблиц (просто в комплекте), и оказалось, что на моем размещенном сервере запущена версия mysql под названием MariaDB, и она выдала ошибку о строке соединения. Вы знакомы с этой версией?

5. Согласно документу это должно сработать mariadb.com/kb/en/library/joining-tables-with-join-clauses вероятно, вам нужно задать более конкретный вопрос, используя тег #mariadb

Ответ №2:

Вы должны присоединиться к таблице внутри подзапроса yle для получения действительного результата

 DELETE tbl_code 
FROM tbl_code
INNER JOIN (
    SELECT tbl_ctoon.expire_date , tbl_ctoon.ctoon_id 
    FROM `tbl_ctoon` 
    LEFT JOIN tbl_code ON tbl_code.ctoon_id=tbl_ctoon.ctoon_id 
               AND tbl_code.code_for='C'
    ) t2 ON t2.ctoon_id =tbl_code.ctoon_id
            AND DATEDIFF( date(NOW( )) , FROM_UNIXTIME(t2. expire_date)) > 3 
WHERE tbl_code.code_for='C'
  

для проверки задействованных строк вы можете

 SELECT *  
FROM tbl_code
INNER JOIN (
    SELECT tbl_ctoon.expire_date , tbl_ctoon.ctoon_id 
    FROM `tbl_ctoon` 
    LEFT JOIN tbl_code ON tbl_code.ctoon_id=tbl_ctoon.ctoon_id 
               AND tbl_code.code_for='C'
    ) t2 ON t2.ctoon_id =tbl_code.ctoon_id
            AND DATEDIFF( date(NOW( )) , FROM_UNIXTIME(t2. expire_date)) > 3 
WHERE tbl_code.code_for='C'
  

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

1. Как насчет моего другого условия where?

2. добавлено другое условие (И tbl_code.code_for=’C’)

3. таким образом, ЛЕВОЕ СОЕДИНЕНИЕ будет рассматривать только сравнение идентификаторов, а AND будет распознан как отдельный WHERE? Спасибо. Я бы об этом не подумал.

4. Условие ON в СОЕДИНЕНИИ — это конкретное условие where только для объединенной таблицы.. когда вашему условию on требуется более одного предложения, вам нужен логический редактор для создания полного предложения И или ИЛИ .. надеюсь, это ясно.

5. Если бы я хотел запустить это как запрос SELECT, чтобы убедиться, что он извлекает правильные записи, прежде чем запускать его как УДАЛЕНИЕ, должен ли я просто изменить первую строку на SELECT * ?

Ответ №3:

Поскольку объединение не сработало, я пошел другим путем. Я запустил это, и оно отлично выполнилось в phpmyadmin для моей базы данных.

 DELETE FROM tbl_code WHERE prz_award IN (SELECT ctoon_id FROM tbl_ctoon WHERE DATEDIFF(DATE(NOW()), FROM_UNIXTIME(expire_date)) > 120) AND tbl_code.code_for = 'C'