web-dev-qa-db-ja.com

MySQLは、各行に固有の1つのクエリ条件で複数の行を削除します

MySQL では、次のように1つのクエリに複数の行を挿入できることがわかっています。

INSERT INTO table (col1,col2) VALUES (1,2),(3,4),(5,6)

同様の方法で複数の行を削除したいと思います。行ごとにまったく同じ条件に基づいて複数の行を削除できることはわかっています。

DELETE FROM table WHERE col1='4' and col2='5'

または

DELETE FROM table WHERE col1 IN (1,2,3,4,5)

ただし、1つのクエリで複数の行を削除し、各行に固有の条件のセットがある場合はどうなりますか?このようなものが私が探しているものです:

DELETE FROM table WHERE (col1,col2) IN (1,2),(3,4),(5,6)

誰もこれを行う方法を知っていますか?それとも不可能ですか?

58
srchulo

あなたは非常に近かったので、これを使用できます:

DELETE FROM table WHERE (col1,col2) IN ((1,2),(3,4),(5,6))

こちらをご覧ください fiddle

96
fthiella

与えられた答えをわずかに拡張したものであるため、質問者や他の誰かに役立つことを願っています。

削除したい値をSELECTすることもできます。ただし、エラー1093に注意してください-FROM句で更新のターゲットテーブルを指定することはできません。

DELETE FROM
    orders_products_history
WHERE
    (branchID, action) IN (
    SELECT
        branchID,
        action
    FROM
        (
        SELECT
            branchID,
            action
        FROM
            orders_products_history
        GROUP BY
            branchID,
            action
        HAVING
            COUNT(*) > 10000
        ) a
    );

1つのアクション/ブランチの履歴レコードの数が10,000を超えるすべての履歴レコードを削除したかった。そして、この質問と選ばれた答えのおかげで、私はできる。

これが役に立つことを願っています。

リチャード。

11