Удаление строки с внутренним соединением

Я создал две таблицы, простые компоненты и комментарии , и связал их с INNER JOIN .

  • Simplecomments – это детали каждого комментатора, включающего их комментарий, reg_date, commentorid и т. Д.
  • Комментарии – это личная информация комментатора со следующими столбцами: id, name, email ..

Я присоединился к ним успешно, однако мне трудно удалить из объединенной таблицы.

Я хочу сделать так:

  1. Если есть последняя строка комментария, называемая –let, скажем A, – то удалите как его комментарии, так и сам A из таблицы.

  2. Else, если A прокомментировал много раз, с разными комментариями, удалит его / ее комментарии, но пусть его / ее личная информация останется, так как у A есть другие комментарии.

Вот как я это сделал:

 if (!empty($_POST["delete"])) { foreach ($_POST["delete"] as $key => $value) { $resultid = $conn->query("SELECT commentorid FROM `simplecomments` WHERE id=".$value); $rowid = $resultid->fetch_assoc(); $outputdelete = $rowid["name"] . " has been deleted" . "<br>"; $deletedname = $deletedname.$outputdelete; $RES = mysql_num_rows($resultid); $counter = 0; while($row = $RES) { //IF IT'S LAST ROW, DELETE COMMENTOR AND HIS/HER COMMENTDETAILS if(++$counter == $results) { $resultid = $conn->query("DELETE FROM `commentor`"); } //ELSE JUST DELETE HIS/HER COMMENTDETAILS, LET HIS/HER INFO REMAIN else{ $resultid = $conn->query("DELETE FROM `simplecomments` WHERE id=".$value); } } } } 

Однако код не будет работать. Я получаю сообщение об ошибке:

Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом [..] …

Рассмотрите возможность запуска DELETE...INNER JOIN и DELETE с помощью условий подзапроса и избегайте циклического извлечения PHP-запроса с if/else поскольку логика выглядит следующим образом:

  1. удалите профиль и комментарии любого комментатора, если у него есть только один комментарий
  2. удалять комментарии только комментатора, если у него есть несколько (т. е. более одного) комментариев.

И да, все три DELETE могут быть запущены одновременно во всех идентификаторах, поскольку взаимно исключающие условия помещаются между первыми двумя и последними. Следовательно, либо первые два затрагивают строки, либо последние влияют на строки на итерацию. Незатронутый (-ые) человек удалит нулевые строки из любой таблицы.

Кроме того, записи simplecomments удаляются сначала, так как эта таблица может иметь ограничение внешнего ключа с комментарием из-за его отношения «один ко многим». Наконец, ниже предполагается, что идентификаторы комментариев передаются в цикл (а не идентификатор комментария ).

PHP (с использованием параметризации, предполагая, что $ conn является объектом соединения mysqli)

 foreach ($_POST["delete"] as $key => $value) { // DELETE COMMENTS AND THEN PROFILE FOR COMMENTORS WITH ONE POST $sql = "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $value); $stmt->execute(); $stmt->close(); $sql = "DELETE c.* FROM `simplecomments` c INNER JOIN `simplecomments` s ON s.commentorid = c.id WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $value); $stmt->execute(); $stmt->close(); // DELETE COMMENTS FOR COMMENTORS WITH MULTIPLE POSTS BUT KEEP PROFILE $sql = "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) > 1"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $value); $stmt->execute(); $stmt->close(); } 

В качестве альтернативы, для подхода DRY-er, выполняйте инструкции SQL в массиве:

 $sqls = array( 0 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1", 1 => "DELETE c.* FROM `simplecomments` c INNER JOIN `simplecomments` s ON s.commentorid = c.id WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1", 2 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) > 1" ); foreach ($_POST["delete"] as $key => $value) { foreach($sqls as $sql) { $stmt = $conn->prepare($sql); $stmt->bind_param("i", $value); $stmt->execute(); $stmt->close(); } }