人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLの書き方、考え方についてアドバイスをください。

[テーブル]

カテゴリ(親子関係になっている、今のところ5段階程度)

-category_id
-parent_id(親子関係のキー)
-name

商品

-id
-category_id
-name

2つのテーブルがこのように繋がっており、カテゴリは入れ子になっています。
この状態で特定のカテゴリを削除する場合、サブカテゴリ、カテゴリに属する商品を一括で削除します。

最初に選んだ削除対象のcategory_idをキーに何回もSQLを発行して、
サブカテゴリと商品を下りながら削除するというのがうまいやり方なのでしょうか?

何か参考になるページ、情報などを頂けると助かります。
よろしくお願いします。


●質問者: southgate_01
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:name SQL うまい アドバイス カテゴリ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● memo77
●35ポイント

環境がわからないのですが、ごく最近のDBには階層問い合わせと言う機能があります。

http://q.hatena.ne.jp/1182220220


階層問い合わせがないなら、例えばSQLServerなら下記のような感じでできますね。


CREATE TABLE #delid(category_id int,PRIMARY KEY(category_id))


INSERT INTO #delid (category_id)

SELECT category_id

FROM t_category

WHERE parent_id = @delete_id


WHILE @@ROWCOUNT>0

BEGIN

INSERT INTO #delid

SELECT T1.category_id

FROM t_category AS T1

INNER JOIN #delid AS T2

ON T1.category_id=T2.parent_id

LEFT OUTER JOIN #delid AS T3

ON T1.category_id=T3.category_id

WHERE T3.category_id IS NULL

GROUP BY T1.category_id

END


DELETE T1

FROM t_shohin AS T1

INNER JOIN #delod AS T2

ON T1.category_id=T2.category_id

◎質問者からの返答

ご丁寧な解答をいただき、ありがとうございます。

なにぶん、サンデープログラマーなのでアドバイスいただいた内容を理解来ません、申し訳ないです。

データベースはMySQLを利用しているのですが、

http://www.mysql.gr.jp/mysqlml/mysql/msg/12071

アドバイスのおかげで参考になりそうなところを見つけることが出来ましたので、頑張ってみます。


2 ● KUROX
●60ポイント ベストアンサー

>最初に選んだ削除対象のcategory_idをキーに何回もSQLを発行して、

>サブカテゴリと商品を下りながら削除するというのがうまいやり方なのでしょうか?

基本的にはYESで問題ない処理だと思います。

速度的に問題なくて、トランザクションが保障されるのなら問題ないと思います。

------

他、考えられるのは

DELETE テーブル名 WHERE category_id EXISTS (select category_id ・・・・)

で、SQLでカテゴリーの一覧を複問い合わせ等を使って簡単に取得できるのなら

そういう方向で・・。

DELETE テーブル名 WHERE category_id IN ('001','012'・・・・)

カテゴリー一覧を配列かなにかに蓄えておいて、それをIN句で展開して削除するとか

たぶん、カテゴリに親子関係があるので、何回も同じカテゴリIDで削除するのが無駄だと

考えるのなら、こういう方向で・・。IN句が使えない場合でも、配列に蓄えて

重複キーで削除しないようにするのなら、速度的に早くはなると思います。

-----

メリットがないのなら、質問文に書いてある方法を私はお勧めします。

◎質問者からの返答

ありがとうございます、大変参考になります。

削除部分はこのやり方でやろうと思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ