No.2ベストアンサー
- 回答日時:
調べてみました。
現在のデータの持ち方は「隣接リストモデル」といって、
SQL的には効率的なデータですが木構造を表現するには冗長すぎるようです。
このデータを入れ子構造モデルという形式に変換することで、
簡単に木構造を表示・集計することが可能です。
例)テーブルstack
node lft rgt
116
223
345
4712
51013
689
71112
CREATE TABLE stack(node char(10),lft int,rgt int);
INSERT INTO stack(node,lft,rgt) VALUES
('1', 1, 6),
('2', 2, 3),
('3', 4, 5),
('4', 7, 12),
('5', 10, 13),
('6', 8, 9),
('7', 11, 12);
これを以下のSQLで可視化します。
SELECT CONCAT( REPEAT( "\t", COUNT( parent.node ) -1 ) , me.node ) AS list
FROM stack AS me, stack AS parent
WHERE me.lft
BETWEEN parent.lft
AND parent.rgt
GROUP BY me.node
ORDER BY me.lft;
肝心の隣接リストモデルから入れ子構造モデルへの変換プロセスですが
プロシージャを使えばなんとか実現可能のようです。
以下に参考サイトをあげておきます。
(mysql用ではないのでちょっと難解かもしれませんけどね・・・)
http://www.geocities.jp/mickindex/database/db_tr …
No.1
- 回答日時:
なんか簡単にできそうな気がするのですが、ぱっとおもいつかないので
ベタに処理をしてみました。
SELECT id as id_1,p_id as pid_1,sort as sort_1,NULL as id_2,NULL as pid_2,NULL as sort_2,NULL as id_3,NULL as pid_3,NULL as sort_3 FROM hoge WHERE p_id=0
UNION(
SELECT H1.id,H1.p_id,H1.sort,H2.id,H2.p_id,H2.sort,NULL,NULL,NULL FROM hoge AS H1
INNER JOIN hoge AS H2
ON H1.id=H2.p_id
WHERE H1.p_id=0
)
UNION(
SELECT H1.id,H1.p_id,H1.sort,H2.id,H2.p_id,H2.sort,H3.id,H3.p_id,H3.sort FROM hoge AS H1
INNER JOIN hoge AS H2 ON H1.id=H2.p_id
INNER JOIN hoge AS H3 ON H2.id=H3.p_id
WHERE H1.p_id=0
)
ORDER BY sort_1,sort_2,sort_3
ここから、idだけを抜き出すにはこんなかんじ・・・
SELECT COALESCE(id_3,id_2,id_1) as id FROM (
SELECT id as id_1,p_id as pid_1,sort as sort_1,NULL as id_2,NULL as pid_2,NULL as sort_2,NULL as id_3,NULL as pid_3,NULL as sort_3 FROM hoge WHERE p_id=0
UNION(
SELECT H1.id,H1.p_id,H1.sort,H2.id,H2.p_id,H2.sort,NULL,NULL,NULL FROM hoge AS H1
INNER JOIN hoge AS H2
ON H1.id=H2.p_id
WHERE H1.p_id=0
)
UNION(
SELECT H1.id,H1.p_id,H1.sort,H2.id,H2.p_id,H2.sort,H3.id,H3.p_id,H3.sort FROM hoge AS H1
INNER JOIN hoge AS H2 ON H1.id=H2.p_id
INNER JOIN hoge AS H3 ON H2.id=H3.p_id
WHERE H1.p_id=0
)
ORDER BY sort_1,sort_2,sort_3) AS DAMMY
この回答へのお礼
お礼日時:2009/12/16 14:05
回答ありがとうございます。やはりSQLでは
シンプルでなく大変そうですね。
結局、基本ひらがな順で、
ソート順がつけられた場合はその順番という複雑な仕様になり・・
SQLでの取得は諦めプログラムで
親から辿る方式にする事になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- MySQL 【MySQL】本当に困っています。詳しい方、ご教授よろしくお願いします。 1 2023/06/03 14:18
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
同一のユーザー、同一商品のと...
-
マイクラPC版のコマンドで効率...
-
テーブル名を省略して「h.id」...
-
副問合せの書き方について
-
複数テーブルのGROUP BY の使い...
-
select文のwhere句に配列を入れ...
-
SQLで残高計算
-
クエリ表示と、ADOで抽出したレ...
-
php+MySQLでレコードが何行目か...
-
select文で特定のIDを抽出しupdate
-
MySQLでのバイナリデータ削除方法
-
sqlで、600行あるテーブルを100...
-
SQL Left Join で重複を排除す...
-
書籍の内容はまともでしょうか?
-
MySQLのint型で001と表示する方...
-
【MySQL】本当に困っているので...
-
SQLサーバから、項目の属性(型...
-
SELECT/別テーブルのレコード...
-
AUTO_INCREMENTのあるテーブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報