階層構造のデータを扱うコツのメモ

*SQL質疑応答スレ 5問目 [#c00c554a]
過去ログ
http://www.23ch.info/test/read.cgi/db/1193486961/753-756

#html{{
<pre>
753 :NAME IS NULL:2008/04/12(土) 01:50:09 ID:THUSkmHr
    階層構造をもったデータで、ツリーの末端になるデータを一発で取得するには、どのようなSQL文を発行すればよいでしょうか?

    ツリー型掲示板のメッセージのテーブル「message」
    +------+--------------+---------+
    |msg_id|msg_id_parent |msg   |
    +------+--------------+---------+
    |  1 |       | カキコ |
    +------+--------------+---------+
    |  2 |      1 | 2GET  |
    +------+--------------+---------+
    |  3 |      2 | 3だよ  |
    +------+--------------+---------+
    |  4 |      2 | >>2 OK |
    +------+--------------+---------+
    |  5 |      4 | はい  |
    +------+--------------+---------+
    |  6 |       | カキコ2 |
    +------+--------------+---------+
    |  7 |      6 | 2GET  |
    +------+--------------+---------+

    msg_id_parent は、親ノードの msg_id を指す
    mdg_id=5,7 のレコードは、自分の下にぶら下がっているコメントなし=ツリーの末端になっている。

    msg_id=5のレコードを抜き出す場合、msg_id=5 を msg_id_parent に持つデータがないということを、
    SQLで表現できれば良いと思いましたが、うまく取得できません。
    副問い合わせ(サブクエリー)というのを使う必要があるのでしょうか?


754 :NAME IS NULL:2008/04/12(土) 02:23:56 ID:???
    >>752
    おぼろげながら理解しました。ありがとうございました。


755 :NAME IS NULL:2008/04/12(土) 02:30:35 ID:???
    >>753
    サブクエリまたはNOT EXISTSを使う必要有り。
    NOT EXISTSの方が速い。

    まあパフォーマンス気にするなら
    (かつ参照回数の方が登録回数よりずっと多いのであれば)
    末端です、というフラグでも持たせたほうがいいけど。

    サブクエリだと
    WHERE msg_id NOT IN (SELECT msg_id_parent FROM message)

756 :753:2008/04/12(土) 14:47:56 ID:THUSkmHr
    >>755
    ありがとうございます。
    そのサブクエリでうまくできました。(・∀・)

    参照回数が多いので、木の葉にフラグデータを持たせるやり方を試してみます。
</pre>
}}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS