同じ列値を持つ特定の行をmysqlテーブルから削除する方法は?


153

MySQLでのクエリに問題があります。私のテーブルには4つの列があり、次のようになります。

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_usersそして、id_product異なるテーブルからの外部キーです。

私が欲しいのは1行だけを削除することです:

1     2     1    2013

これは2回表示されるので、削除したいだけです。

私はこのクエリを試しました:

delete from orders where id_users = 1 and id_product = 2

ただし、両方が削除されます(重複しているため)。この問題を解決するためのヒントはありますか?

回答:


208

削除クエリにlimitを追加します

delete from orders 
where id_users = 1 and id_product = 2
limit 1

3
これにより、1つの行のみが削除されます。このユーザーと製品IDを持つ3があった場合、2が残ります。
ロブ

10
はい、OPは1行を削除したいと言っています。それが私のクエリが行うことです。
juergen d 2013

2
はい、しかし私はこれが彼/彼女が望んでいるものではないと思います。
ロブ

3
ユルゲン、ありがとうございます。これで十分です!
ダニ

3
OPが実際に行う必要があるのは、最初にどの行が重複しているかを確認してから、重複を削除することです。
wbinky 2014年

64

すべてのテーブルには主キー(1つまたは複数の列で構成される)が必要です。リレーショナルデータベースでは、重複する行は意味がありません。以下を使用しLIMITて、削除する行の数を制限できます。

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

しかし、それは現在の問題を解決するだけであり、主キーを定義することにより、より大きな問題に間違いなく取り組む必要があります。


1
これは、主キーがリレーショナルデータベース内で一意であることを言及するのに適しています。
Paul

1
@Paulこれはまさに私が言おうとしていることです。ただし、一意のキーが主キーである必要はないことを忘れないでください。
Ryan Fung

20

削除する行数を指定する必要があります。あなたの場合(そして私はあなたが1つだけを保持したいと思うと思います)これは次のように行うことができます:

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

一つだけを保つためにはない、あなたにロブをありがとう、ない...私はちょうど1つの行を削除したい
ダニ・

これは5.5.40では機能しません。構文エラーがスローされます。ここで述べたように:stackoverflow.com/a/578926/1076075、サブクエリを使用してLIMIT句の値を指定できないようです。ものをこの方法でやろうとしている人にとって、このアウトをチェック:stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju

8

テーブルを設計する最良の方法は、自動インクリメントとして一時行を1つ追加し、主キーとして保持することです。したがって、このような問題を回避できます。


1
または永続的な行。これは古い質問であることは知っていますが、私は言っておきますが。Idはこのような状況で使用されます。スペースが気になる場合:BIGINTはわずか8バイトです!
Ismael Miguel

5

による行の削除に関する回答はすでにありますLIMIT。理想的には、テーブルに主キーが必要です。しかし、ない場合。

私は他の方法を提供します:

  1. 一意のインデックスを作成する

id_usersとid_productはあなたの例では一意である必要があります。

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

これらは、同じデータを持つ重複行を削除します。

しかし、それでもエラーが発生する場合は、IGNORE句を使用しても、次のことを試してください。

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. もう一度テーブルを作成する

重複する値を持つ複数の行がある場合は、テーブルを再作成することもできます

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

1

各行ごとに自動インクリメントするIDを追加する必要があります。その後、IDで行を削除できます。したがって、テーブルには各行に一意のIDがあり、id_user、id_product ecc ...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.