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

SQL質疑応答スレ 5問目

過去ログ
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
Last-modified: 2013-01-20 (日) 23:30:04 (2006d)