0

これは私の最初のクエリです:

SELECT bid_tag.*
FROM bid_tag join
     (select serial_number, count(*) as cnt
      from bid_tag where user_id = 0
      group by serial_number
     ) tsum
     on tsum.serial_number = bid_tag.serial_number and cnt > 1
order by bid_tag.serial_number
LIMIT 0, 21000;

これらの結果から、データベースからすべてのレコードを選択する必要がありtag_design = 0 AND tag_size = 0ます。DELETE

最初のクエリの結果に対してクエリを実行する方法がわかりません。

4

2 に答える 2

2

に置き換えるだけSELECTDELETE、選択されていた行が削除されます。

DELETE bid_tag.*
FROM bid_tag join
     (select serial_number, count(*) as cnt
      from bid_tag where user_id = 0
      group by serial_number
     ) tsum
     on tsum.serial_number = bid_tag.serial_number and cnt > 1
WHERE tag_design = 0 AND tag_size = 0
order by bid_tag.serial_number
LIMIT 0, 21000;
于 2013-08-01T17:55:25.697 に答える
0

where句で用語を使用EXISTSします。

DELETE
  FROM bid_tag btd
 WHERE EXISTS (
           SELECT 1
             FROM (
                     SELECT bid_tag.*
                       FROM bid_tag bts
                       JOIN (
                               SELECT serial_number, count(*) as cnt
                                 FROM bid_tag btj
                                WHERE btj.user_id = 0
                             GROUP BY btj.serial_number
                            ) tsum
                         ON (     tsum.serial_number = bts.serial_number
                              AND tsum.cnt > 1
                            )
                      WHERE bts.tag_design = 0
                        AND bts.tag_size = 0
                   ORDER BY bts.serial_number
                      LIMIT 0
                          , 21000
                  ) rs_base
            WHERE rs_base.id = btd.id   -- PK column
      )
      ;

ターム内のサブクエリをEXISTSさらにネストして、元のクエリの結果セットに別のクエリを含めることができます。削除を実行するテーブルの主キーを常に選択するようにしてください。

おそらく、削除操作で結果セットの一部に制限したくないので、上位 21000 件の結果に制限する必要があるかどうかを確認してください。そうでない場合は、'ORDER BY' 句と 'LIMIT' 句を削除してください。 .

于 2013-08-01T18:00:41.607 に答える