#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'