3

私はこれがかなり混乱しているように聞こえることを知っていますが、私はそれをよりよく説明する方法を失っています. 以下に簡略化した表を示します。

DB Type       ID
================
Table1         1                 
Table1         2                 
Table1         3                 
Table1         4                 
Table1         5                 
Table2         6                 
Table2         7                 
Table2         8                 
Table2         9                 
Table2        10 

私が達成しようとしているのは、基本的にこのテーブルを一掃することですが、それが理にかなっている場合は各 DB タイプの最大 ID を持つレコードを保持することです。したがって、この場合は (Table1,5) と (Table2,10) になります。他のレコードは削除されています。これを MySQL だけで行うことは可能ですか?

*編集***

Yogendra Singh からのヒントを参考に回答してください

DELETE FROM MyTable WHERE ID NOT IN (SELECT * FROM (SELECT MAX(ID) from MyTable GROUP BY DB Type) AS tb1 ) ORDER BY ID ASC
4

5 に答える 5

3

最初に最大IDグループを選択してから、サブクエリとして使用してみてください。db_typenot in

 DELETE FROM MyTable 
 WHERE ID NOT IN 
    (SELECT ID FROM 
      (SELECT MAX(ID) AS ID from MyTable GROUP BY DB Type) AS tb1
    )

編集:

 DELETE FROM MyTable
 HAVING MAX(ID) > ID;
于 2012-11-28T16:39:09.143 に答える
1
delete your_table
from
  your_table left join
  (select max(id) max_id from your_table group by type) mx
  on your_table.id=mx.max_id
where mx.max_id is null

サブクエリはすべてのタイプの最大 ID を返し、それらは保持する値です。左結合では、テーブルから max_ids に含まれていないすべての行を選択しています。これらは削除する行です。これは、id が主キーの場合にのみ機能します。それ以外の場合は、型も結合する必要があります。

于 2012-11-28T16:50:18.510 に答える
1

DB Type - ID の組み合わせは一意ですか?

その場合、これを 2 段階で攻撃できます。

  1. 必要な行だけを取得する

    SELECT [DB Type], Max(ID) AS MaxID
    FROM YourTable
    GROUP BY [DB Type]
    
  2. 残りを削除します (前のステートメントをより複雑なステートメントにラップします。その意味ではありません)

    DELETE FROM YourTable
    FROM
        YourTable
        LEFT JOIN
        (SELECT [DB Type], Max(ID) AS MaxID
         FROM YourTable GROUP BY [DB Type]) DontDelete
        ON
          YourTable.[DB Type]=DontDelete.[DB Type] AND
          YourTable.ID=DontDelete.MaxID
    WHERE
      DontDelete.[DB Type] IS NULL
    
于 2012-11-28T17:25:15.190 に答える
0
delete from my_Table  
 where Day in (select  MAX(day) d from my_Table   where id='id')
于 2013-06-19T05:46:07.020 に答える
0
DELETE FROM MyTable del
WHERE EXISTS ( 
    (SELECT * 
     FROM MyTable xx
     WHERE xx."db Type" = del."db Type"
     AND xx.id > del.id
     );
于 2012-11-28T17:41:25.510 に答える