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
しかし、それはそれらの両方を削除します(それらが重複しているので)。この問題を解決する上で何かヒントはありますか?
delete queryにlimit
を追加します
delete from orders
where id_users = 1 and id_product = 2
limit 1
すべてのテーブルは主キー(単一または複数の列からなる)を持つ必要があります。リレーショナルデータベースでは重複行は意味がありません。 LIMIT
を使用して削除行の数を制限できます。
DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 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つ追加し、主キーとして保持することです。だから我々はそのような上記の問題を回避することができます。
LIMIT
で行を削除するための回答は既にあります。理想的にはあなたのテーブルに主キーがあるべきです。しかし、そうでなければ。
私は他の方法を挙げます。
あなたの例では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;
重複する値を持つ行が複数ある場合は、テーブルを再作成することもできます。
RENAME TABLE `orders` TO `orders2`;
CREATE TABLE `orders`
SELECT * FROM `orders2` GROUP BY id_users, id_product;
行ごとに自動インクリメントするIDを追加する必要があります。その後、そのIDで行を削除できます。だからあなたのテーブルは各行とid_user、id_product eccのためのユニークなIDを持つでしょう...