0

ID の配列を返す一見複雑な選択があります。このIDの配列を使用したいと思います

DELETE FROM cart_items WHERE id in (

    SELECT id AS the_count 
    FROM cart_items 
    GROUP BY session_code 
    HAVING COUNT(session_code) > 100

);

私がやりたいのは、内側の選択 (機能する) と IN の削除の配列を使用することです...

このコードはエラーをスローしています:

「FROM 句で更新するターゲット テーブル 'cart_items' を指定することはできません」

4

3 に答える 3

1

サブセレクトでこれを試して、新しいエイリアスを提供してください

DELETE FROM cart_items WHERE id in (
SELECT cart_items_todelete.id FROM (
    SELECT id  
    FROM cart_items 
    GROUP BY session_code 
    HAVING COUNT(session_code) > 100 
) cart_items_todelete  

);
于 2013-09-22T10:53:36.767 に答える
0

代わりにこのようなクエリを使用しないでください。

DELETE FROM cart_items WHERE id IN (
    SELECT c.id FROM (
        SELECT  a.id AS id FROM
            cart_items a, (
                SELECT session_code
                FROM cart_items
                GROUP BY session_code
                HAVING COUNT(session_code) > 100
        ) b
        WHERE
            a.session_code = b.session_code
    ) c
);

あなたのクエリとここでの回答で提案されたものは、IDが異なる可能性があることを考慮していません。同じセッションの同じ ID とは限りませんよね!

あなたはするであろう

  • 最初に 100 回以上表示されるセッション コードを見つけます
  • allこのセッション コードを持つ ID を検索します
  • 最後にそれらの行を削除します

これがあなたが達成したいことであることを願っています。

于 2013-09-22T12:34:47.173 に答える
0

EXISTS 句の使用を検討しましたか。

DELETE
  FROM cart_items TGT
 WHERE EXISTS
      (SELECT 'x'
         FROM cart_items SRC
        WHERE SRC.session_code = TGT.session_code
        GROUP BY session_code
       HAVING COUNT(session_code) > 100
      );
于 2013-09-22T13:29:40.300 に答える