web-dev-qa-db-ja.com

同じカラム値を持つmysqlテーブルから特定の行を削除するにはどうすればいいですか?

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_usersid_productは異なるテーブルからの外部キーです。

欲しいのは1行だけ削除することです。

1     2     1    2013

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

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

delete from orders where id_users = 1 and id_product = 2

しかし、それはそれらの両方を削除します(それらが重複しているので)。この問題を解決する上で何かヒントはありますか?

146
Dani

delete queryにlimitを追加します

delete from orders 
where id_users = 1 and id_product = 2
limit 1
195
juergen d

すべてのテーブルは主キー(単一または複数の列からなる)を持つ必要があります。リレーショナルデータベースでは重複行は意味がありません。 LIMITを使用して削除行の数を制限できます。

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

しかし、これは現在の問題を解決するだけなので、主キーを定義して大きな問題に確実に取り組む必要があります。

62
dnet

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

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)
20
Rob

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

8
praveenraj4ever

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;
5
Somnath Muluk

行ごとに自動インクリメントするIDを追加する必要があります。その後、そのIDで行を削除できます。だからあなたのテーブルは各行とid_user、id_product eccのためのユニークなIDを持つでしょう...

1
Andrei Tornea