sql >> データベース >  >> RDS >> Mysql

内部結合を使用して行を削除する

    DELETE...INNER JOINの実行を検討してください およびDELETE サブクエリ条件を使用し、if/elseでPHPクエリフェッチのループを回避します ロジックは次のように思われるため:

    1. コメントが1つしかない場合は、コメント投稿者のプロフィールとコメントを削除します
    2. コメント投稿者のコメントが複数(つまり、複数)ある場合は、コメント投稿者のコメントのみを削除します。

    はい、3つすべてのDELETE 最初の2つと最後の1つの間に相互に排他的な条件が設定されるため、すべてのIDで同時に実行できます。したがって、最初の2つは行に影響するか、最後の1つは反復ごとの行に影響します。影響を受けていないものは、いずれかのテーブルからゼロ行を削除します。

    また、簡単なコメント このテーブルにはcommentorとの外部キー制約がある可能性があるため、レコードが最初に削除されます その1対多の関係のため。最後に、以下はコメントを想定しています IDはループに渡されます(コメンターではありません) id)。

    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();
       }
    }
    



    1. ODP.NETのOracleParameterを介して渡されたバインディング変数のトレース情報を取得するにはどうすればよいですか?

    2. dotNetChat_で始まるテーブルを作成すると、MySQLを再起動すると消えます

    3. 日付範囲全体の平均スコアを選択するSQL

    4. Salesforceドライバーは一括アクションをサポートしていますか?