- PR -

カテゴリをツリー形式で取得するには

1
投稿者投稿内容
しろくま
常連さん
会議室デビュー日: 2004/10/15
投稿数: 35
投稿日時: 2007-05-23 11:36
ネット販売サイトで商品などを「食べもの・スイーツ・和菓子・だんご」のようにカテゴリ分けさせれいますがこのカテゴリをSQL一発でツリー形式で取得は可能なのでしょうか。

osCommerceやZenCartなどフリーのショッピングサイトソフトのDBレイアウトを見るとカテゴリマスタ以下のようになっています。
整理順(sort_order)なる項目もありますが、カテゴリ間で付け替えを行った場合はメンテが大変そうなので、この項目は自カテゴリ中での並び順かと勝手に思っています。

categories
----------------------------------------
categories_id int(11) カテゴリーID
parent_id int(11) 親ID
categories_name varchar(32) カテゴリ名

のようになっています。


ここに以下のようにデータが入っている場合
(上位カテゴリが無いものはparent_idは0としてあります)
----------------------------------------
1 0 食べもの
2 0 飲みもの
3 0 遊ぶもの
4 1 水産物
5 1 肉
6 1 スイーツ
7 1 野菜
8 1 くだもの
9 6 和菓子
10 6 洋菓子
11 9 だんご
12 9 ようかん
13 9 カステラ

どのようにすれば以下のようなツリー形式でデータ取得が出来るのでしょうか。
----------------------------------------
1 0 食べもの
4 1 水産物
5 1 肉
6 1 スイーツ
9 6 和菓子
11 9 だんご
12 9 ようかん
13 9 カステラ
10 6 洋菓子
7 1 野菜
8 1 くだもの
2 0 飲みもの
3 0 遊ぶもの

方法は?
1.まず親ID順(とりあえず昇順)に取得
2.そのカテゴリーIDと同じ親IDを持つレコードを取得...
って段階で簡単には行きそうにも無いですね。
素直にカテゴリを全件取得した後にPG側でなんとかする!
しか無いって事でしょうか。


[ メッセージ編集済み 編集者: しろくま 編集日時 2007-05-23 11:37 ]
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-05-24 11:43
手元にOracle環境が無いのでバシっとSQLは提示出来ませんが、やろうと思えば副問い合わせとか使って一発で可能です。

但し、テーブルの件数増減によるパフォーマンスやプログラムの可読性を考えて行ったほうがいいと思いますけどね。

SQLの分かりやすいリファレンスとしてはSAK StreetのSQLページを一通り見れば理解できると思います。


よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-05-24 12:54
ORACLEなら、connectbyでどうでしょうか?
同じく、手元にORACLE環境がないのですが。
しろくま
常連さん
会議室デビュー日: 2004/10/15
投稿数: 35
投稿日時: 2007-05-24 21:59
レスありがとうございます。

環境を書き忘れていました。
PostgresSQL8.xになります。

階層問い合わと言うものだったのですね、私がやろうとしていた事は。
よっしーさんの提示されたconnectbyでググッて見て初めて知りました...

PostgresSQLではデフォルトでは使用できないけど、モジュールを組み込む事により
connectby()関数で近い事が出来そうなのでちょっと調べてみます。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)