5

mysql テーブルの更新に関する問題に直面しています。ID、NAME、TIMESTAMP、およびその他の 2 つの列を含む 5 つの列を含むテーブルがあります。私の問題は、ID と NAME の両方が別の行、ID と NAME の両方と一致する行を削除し、最新の TIMESTAMP 行を保持することです。

次のクエリを試していますが、エラーが表示されます。

#1093 - FROM 句で更新対象のテーブル 'dummy1' を指定することはできません

クエリは次のとおりです。

delete from dummy1  where LAST_USED_DATE not in(
select max(LAST_USED_DATE) from dummy1
group by ID,NAME);
4

2 に答える 2

3

試す

DELETE d
  FROM dummy1 d JOIN 
(
  SELECT d1.id, d1.name, MAX(d1.last_used_date) max_date
    FROM dummy1 d1 JOIN dummy1 d2
      ON d1.id = d2.id AND d1.name = d2.name
   GROUP BY id, name
) q ON d.id = q.id AND d.name = q.name AND d.last_used_date <> q.max_date

これがSQLFiddleのデモです

更新重複する ID のみをチェックするには、上記のクエリを少し調整できます

DELETE d
  FROM dummy1 d JOIN 
(
  SELECT d1.id, MAX(d1.last_used_date) max_date
    FROM dummy1 d1 JOIN dummy1 d2
      ON d1.id = d2.id
   GROUP BY id
) q ON d.id = q.id AND d.last_used_date <> q.max_date

これがSQLFiddleのデモです

UPDATE2タイムスタンプが最大の重複を削除するには

1) オプションで一意のインデックスを導入することで可能になりIGNOREます。その場合、MySql は保持するレコードを自身で決定します。

ALTER TABLE dummy1 ENGINE MyISAM;
ALTER IGNORE TABLE dummy1 ADD UNIQUE (id, name);
ALTER TABLE dummy1 ENGINE InnoDB;
于 2013-06-18T05:55:12.377 に答える
1

フィドルがなくても、試してみます。これを試して:

DELETE D1.* FROM DUMMY1 D1
JOIN (SELECT D.ID,D.NAME, MAX(LAST_USED_DATE) DATE FROM DUMMY1 D GROUP BY D.ID) D2 ON D1.ID = D2.D2
WHERE D1.NAME = D2.NAME AND D1.LAST_USED_DATE <> D2.DATE

あなたが維持しているので、私は逆になりますMAX(LAST_USED_DATE)

于 2013-06-18T05:55:20.580 に答える