みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MySQLで別テーブルを参照し、レコードを消したい

お世話になります。MySQL4のデータベース上に2つのテーブルがあるのですが、
片方のテーブル(a)にあるフィールド(b_id)の値を参照し、もう片方のテーブル(b)のレコードを消していきたいのです。

具体的には以下のようなテーブル(a)とテーブル(b)があります。


TBL: a
===========================
id    b_id    category
===========================
0     1       3
---------------------------
1     2       1
---------------------------
2     3       2
---------------------------
3     4       2
---------------------------


TBL: b
===========================
id    name    price
===========================
0    goodsA   1,000
---------------------------
1    goodsB   500
---------------------------
2    goodsC   250
---------------------------
3    goodsD   2,500
---------------------------
4    goodsE    1,800
---------------------------


やりたいことは、テーブル(a)の「category」フィールドが「2」以外であれば、
そのレコードの「b_id」にある数値を「id」にもつ、テーブル(b)のレコードを消していきたいのです。

上記の例だと、テーブル(a)のid「0」と「1」がcategoryに「2」以外を持っています。
この2つのレコードのb_idは「1」と「2」ですので、テーブル(b)のid「1」と「2」を消したいと思っています。

SQLについて知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。
よろしくお願いします。

投稿日時 - 2011-05-20 16:06:17

QNo.6750854

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> MySQL4のデータベース上に

「MySQL4」などというバージョンの提示は、提示していないのと同じです。MySQL 4.1、5.0といったレベルまでは、最低限で提示するようにしてください。

すぐに思い出すだけでも、MySQL 4.0と4.1では、次のような大きな機能追加や一部の仕様変更があります。

MySQL 4.0まで・・・一部のジョイン、union、一時表などは実装済み
MySQL 4.1・・・サブクエリの実装、ジョインの拡張、unicodeの実装。それにより、varchar(n)のnが、バイト数から文字数に仕様変更
MySQL 5.0・・・ビュー表、ストアドプロシジャ、トリガなどの実装


#1さんからexistsを使った具体的なSQL例が提示されていますが、構文エラーになったとのこと。サブクエリは、MySQL 4.1での実装ですが、MySQL 4.0を使っているのでは?

MySQL 4.0で動くかどうか不明ですが、MySQLには他表を利用したdelete文に、独自構文があります。

-- MySQLのdelete文の独自構文
delete b from a,b
where category<>2
and a.b_id=b.id

投稿日時 - 2011-05-21 02:41:16

ANo.1

delete from b
where exists(
select *
from a
where a.category <> 2
and a.b_id = b.id);
ですかね。
MySQLの環境がないので動作確認はしていません。

投稿日時 - 2011-05-20 16:56:42

補足

さっそくのご回答ありがとうございます。上の質問内容の通り、テーブルaとbを作成し、ご回答いただいたSQL文を打ち込んでみました。

mysql> delete from b
-> where exists(
-> select *
-> from a
-> where a.category <> 2
-> and a.b_id = b.id);

ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'exists( select * from a where a.category <> 2 and a.b_id = b.id

という具合でシンタックスエラーが出てしまいました。ただ、EXISTS関数がとてもヒントになりそうなので、これから自分でも調べてみます!

投稿日時 - 2011-05-20 18:31:43

あなたにオススメの質問