質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

2440閲覧

RDB(mysql)からリストメニュー。入れ子集合モデルを作る前段階の隣接リストモデル作成

daisaku64

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/08/06 06:08

編集2017/08/07 01:49

###実現したいこと
下記の products_table を読み込み、その下にある convert.sql をsqlまたはphpにて書き出したいのですが、どのたかヒントをください。
ちなみに「接続リストモデル」とは、レコードに親 ID を持たせて親子関係を表現するモデルのことです(※重要)
他のサイトにSQLを使ってSQLを生成するということを実際行っている達人がいらっしゃったので、いろいろ試してはいるのですがうまくいきません。
SQLの詳しい方ご教授ください。よろしくお願い致します。

Mysql は5.6、PHP は5.4です

SQL初心者

タグ #SQL #データベース #木構造 #入れ子集合モデル #RDB

###用意したテーブル(products_tbl)

hs_idct_01ct_02ct_03ct_04ct_05ct_06nameURL
1001AAAAAAA-ct4name1001http://www
1002AAABBBA-ct4name1002http://www
1003AAABBBB-ct4name1003http://www
1004AAACCCA-ct4name1004http://www
1005ABBBBBA-ct4name1005http://www
1006ABBBBBA-ct4name1006http://www
1007ABBCCCB-ct4name1007http://www
1008BAAAAAA-ct4A-ct5A-ct6name1008http://www
1009BBBAAAB-ct4B-ct5name1009http://www
1010BBBBBBA-ct4C-ct5name1010http://www

sql

1create table tbl( 2id int not null unique, 3parent_id int null, 4name varchar(30), 5url varchar(100), 6link tinyint, 7level int not null default 0, 8l int null, 9r int null 10);

###作りたいsql(convert.sql)親子関係をparent_idに

sql

1insert into tbl(id,parent_id,name,url,link) values 2( 1,null,'A','#',1), 3( 2,null,'B','#',1), 4( 3,1,'AA','#',1), 5( 4,1,'BB','#',1), 6( 5,2,'AA','#',1), 7( 6,2,'BB','#',1), 8( 7,3,'AAA','#',1), 9( 8,3,'BBB','#',1), 10( 9,3,'CCC','#',1), 11(10,4,'BBB','#',1), 12(11,4,'CCC','#',1), 13(12,5,'AAA','#',1), 14(13,6,'AAA','#',1), 15(14,6,'BBB','#',1), 16(15,7,'A-ct4','#',1), 17(16,8,'A-ct4','#',1), 18(17,8,'B-ct4','#',1), 19(18,9,'A-ct4','#',1), 20(19,10,'A-ct4','#',1), 21(20,11,'B-ct4','#',1), 22(21,12,'A-ct4','#',1), 23(22,13,'B-ct4','#',1), 24(23,14,'A-ct4','#',1), 25(24,21,'A-ct5','#',1), 26(25,22,'B-ct5','#',1), 27(26,23,'C-ct5','#',1), 28(27,24,'A-ct6','#',1), 29(28,15,'name1001','www',1), 30(29,16,'name1002','www',1), 31(30,17,'name1003','www',1), 32(31,18,'name1004','www',1), 33(32,19,'name1005','www',1), 34(33,19,'name1006','www',1), 35(34,20,'name1007','www',1), 36(35,27,'name1008','www',1), 37(36,25,'name1009','www',1), 38(37,26,'name1010','www',1);

###試したこと
SQLの「COUNT」と「GROUP BY」を使い結果を連結

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SVC34

2017/08/06 07:52

要件や制約を文章で示してください
daisaku64

2017/08/06 14:26 編集

Mysql は5.6、PHP は5.4です かなり難しい内容です。
daisaku64

2017/08/07 07:59

SVC34さん いろいろと説明不足でごめんなさい。30年ぶりのプログラミングなもので。次は気をつけます。
guest

回答3

0

ベストアンサー

これは前回さらっとながした経路列挙モデルを利用します。
実際ご提示されたサンプルが中途半端な経路列挙モデルなので連携がとれていません
以下テストしてみて下さい

  • productsテーブル

SQL

1create table products_tbl( 2hs_id int,ct_01 varchar(30),ct_02 varchar(30),ct_03 varchar(30),ct_04 varchar(30),ct_05 varchar(30),ct_06 varchar(30),name varchar(30),URL varchar(200)); 3insert into products_tbl values 4(1001,'A','AA','AAA','A-ct4','','','name1001','http://www'), 5(1002,'A','AA','BBB','A-ct4','','','name1002','http://www'), 6(1003,'A','AA','BBB','B-ct4','','','name1003','http://www'), 7(1004,'A','AA','CCC','A-ct4','','','name1004','http://www'), 8(1005,'A','BB','BBB','A-ct4','','','name1005','http://www'), 9(1006,'A','BB','BBB','A-ct4','','','name1006','http://www'), 10(1007,'A','BB','CCC','B-ct4','','','name1007','http://www'), 11(1008,'B','AA','AAA','A-ct4','A-ct5','A-ct6','name1008','http://www'), 12(1009,'B','BB','AAA','B-ct4','B-ct5','','name1009','http://www'), 13(1010,'B','BB','BBB','A-ct4','C-ct5','','name1010','http://www');

経路列挙モデルテーブルを作ります

SQL

1create table keiro_tbl( pid int null,id int not null unique auto_increment,keiro varchar(255),name varchar(30),url varchar(255));

今回最大6階層+アイテムなので7回インサートします

SQL

1insert into keiro_tbl(keiro,name,url) 2select distinct concat('/',ct_01,'/') ,ct_01,'#' from products_tbl where ct_01!=''; 3insert into keiro_tbl(keiro,name,url) 4select distinct concat('/',ct_01,'/',ct_02,'/') ,ct_02,'#' from products_tbl where ct_02!=''; 5insert into keiro_tbl(keiro,name,url) 6select distinct concat('/',ct_01,'/',ct_02,'/',ct_03,'/') ,ct_03,'#' from products_tbl where ct_03!=''; 7insert into keiro_tbl(keiro,name,url) 8select distinct concat('/',ct_01,'/',ct_02,'/',ct_03,'/',ct_04,'/') ,ct_04,'#' from products_tbl where ct_04!=''; 9insert into keiro_tbl(keiro,name,url) 10select distinct concat('/',ct_01,'/',ct_02,'/',ct_03,'/',ct_04,'/',ct_05,'/') ,ct_05,'#' from products_tbl where ct_05!=''; 11insert into keiro_tbl(keiro,name,url) 12select distinct concat('/',ct_01,'/',ct_02,'/',ct_03,'/',ct_04,'/',ct_05,'/',ct_06,'/') ,ct_06,'#' from products_tbl where ct_06!=''; 13insert into keiro_tbl(keiro,name,url) 14select distinct concat('/',ct_01,if(ct_02!='','/',''),ct_02,if(ct_03!='','/',''),ct_03,if(ct_04!='','/',''),ct_04,if(ct_05!='','/',''),ct_05,if(ct_06!='','/',''),ct_06,'/',name,'/') ,name,url from products_tbl;

上記親のID(pid)がついてないので、updateします。

SQL

1update keiro_tbl as t1,keiro_tbl as t2 2set t1.pid=t2.id where t1.keiro=concat(t2.keiro,t1.name,'/') 3
  • 本チャンテーブル

SQL

1create table tbl( 2id int not null unique, 3parent_id int null, 4name varchar(30), 5url varchar(100), 6link tinyint, 7level int not null default 0, 8l int null, 9r int null 10); 11

流し込み

SQL

1insert into tbl(id,parent_id,name,url,link) 2select id,pid,name,url,1 from keiro_tbl 3

※経路カラムやurlカラムは長くなりがちなのでvarcharで収まらない場合は
適当なテキスト系の型を設定して下さい

投稿2017/08/07 01:56

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisaku64

2017/08/07 02:06

yambejpさん 前回は大変勉強になりました。 まずはソース読んでみます、ホント助かります ありがとうございます。感謝感謝
daisaku64

2017/08/07 03:46

私もこのページで入れ子集合モデルについて納得しました。 でもなかなか応用できませんでww 頑張ります。まだyambejpさんのソース解読中です。
daisaku64

2017/08/07 06:50

経路列挙モデルテーブル この考え方すごいです!このテーブルのおかげで親IDが2行のSQLで取得できるんですね〜 すごい!関心しました! 1)商品データをインサートする 2)経路列挙モデルテーブルを作ります 3)経路列挙モデルテーブルにデータをインサート 4)親IDを更新する 5)隣接リストモデルテーブルを作ります 6)隣接リストモデルテーブルに流し込みします 7)コンバート用プロシジャーを実行 8)入れ子集合モデル完成(親子関係のリスト完成) 綺麗にWEB表示できました! 今回の一連のソース大事に勉強します 本当にありがとうございました。プログラミングも30年も経つと忘れるものですね 若い人たちに負けないように再び勉強します。 感謝。感謝。
guest

0

tblのCREATE TABLE文も少し変えてあります。
「COUNT」の使い所が謎ですが、
linkがcountの値を入れるなら、適宜書き換えてください。

以下のSQLでtbl.idの6まで登録可能です。
続きは考えてみてください。

sql

1create table tbl( 2id int not null auto_increment unique, 3parent_id int null, 4name varchar(30), 5url varchar(100), 6link tinyint not null default 1, 7level int not null default 0, 8l int null, 9r int null 10); 11 12 13insert into tbl 14( 15 parent_id 16 , name 17 , url 18) 19SELECT null 20 , T1.ct_01 21 , '#' 22FROM products_tbl T1 23GROUP BY T1.ct_01 24; 25 26 27insert into tbl 28( 29 parent_id 30 , name 31 , url 32) 33SELECT ( 34 SELECT id 35 FROM tbl T2 36 WHERE T2.parent_id IS NULL 37 AND T2.name = T1.ct_01 38 AND T2.url = '#' 39 ) 40 , T1.ct_02 41 , '#' 42FROM products_tbl T1 43GROUP BY T1.ct_01 44 , T1.ct_02 45; 46

投稿2017/08/06 16:44

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisaku64

2017/08/06 23:29

ありがとうございます。 教えていただいたsql勉強してみます。 テストしたら確かに6行出来上がっています。 本番のデータは1000件弱ありますので対応できるか判断してみます
daisaku64

2017/08/07 01:45

読んでみました。これは単純にproducts_tblを見ながらtblに書き出してるだけですよね? products_tblは変更・削除などが頻繁にあるため自動化したいだけなんです。 すみません。まだ実現したいことが伝わっていないようで・・・ SQLやPHPを使い「convert.sql」というSQL文を自動的に生成したいのです。(入れ子集合モデルを作るため) そして生成されたSQLを「product_tbl」に変更があったときに自動的に起動するという流れです
tomari_perform

2017/08/07 02:51

続きを考えて、id37まで登録するSQLはできましたか? とりあえず、どーしてもinsert文のsqlファイルを作成したいのであれば、1000行程度のデータであれば、毎回、全データを一時テーブルに格納し直して、一時テーブルからconcat句とinto句等を使って、sqlファイルを出力したりしても良いかと。 ちなみに、流れ的に、変更があったときに、わざわざ事前に作成したsqlファイルを実行するという事のであれば、 変更があったときに、product_tblを変更する前にtblにデータを登録しても良いのでは?とは思います。
daisaku64

2017/08/07 06:53

tomari_performさん このたびは説明がかなり不足してご迷惑をおかけしました。 30年ぶりのプログラミングで思うように説明できませんでした また何かありましたらお力をお貸しください。 ありがとうございました。
guest

0

SQLを使ってSQLを書き出すということを実際行っている達人
convert.sql

⇒目的は分かりませんが、convert.sqlで記述された内容を出力するくらいなら、
INSERT INTO tbl(~~) SELECT~
の方が効率は良いです。

挿入先のテーブルのidを使いまわしているため、
1つのSQLで作るのはかなり難しい(というより面倒&大変。不可能ではない)ですが、
複数回(7回くらい)、SQLを実行して作成する事をおすすめします。

おまけ(テストデータ)

sql

1create table products_tbl( 2 hs_id int 3 , ct_01 varchar(30) 4 , ct_02 varchar(30) 5 , ct_03 varchar(30) 6 , ct_04 varchar(30) 7 , ct_05 varchar(30) 8 , ct_06 varchar(30) 9 , name varchar(30) 10 , url text 11); 12insert into products_tbl VALUES 13 (1001, 'A','AA','AAA','A-ct4','','','name1001','http://www') 14,(1002, 'A','AA','BBB','A-ct4','','','name1002','http://www') 15,(1003, 'A','AA','BBB','B-ct4','','','name1003','http://www') 16,(1004, 'A','AA','CCC','A-ct4','','','name1004','http://www') 17,(1005, 'A','BB','BBB','A-ct4','','','name1005','http://www') 18,(1006, 'A','BB','BBB','A-ct4','','','name1006','http://www') 19,(1007, 'A','BB','CCC','B-ct4','','','name1007','http://www') 20,(1008, 'B','AA','AAA','A-ct4','A-ct5','A-ct6','name1008','http://www') 21,(1009, 'B','BB','AAA','B-ct4','B-ct5','','name1009','http://www') 22,(1010, 'B','BB','BBB','A-ct4','C-ct5','','name1010','http://www') 23;

投稿2017/08/06 15:36

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisaku64

2017/08/06 15:57

tomari_performさん ありがとうございます。 convert.sqlを自動で作りたいのんです。 convert.sqlには親子関係が記されています 例えば「AA」の親は「A」なので「AA」の parent_id は「A」のid=1が入ります 「AAA」の親は「AA」なので「AAA」のparent_id は「AA」のid=3が入ります。 少し難しいですがよろしくお願い致します。
daisaku64

2017/08/06 16:00

PHPに複数のSQLを実行させても構いません
tomari_perform

2017/08/06 16:43

複数のSQLを実行しても良い条件下であれば、 難しくないですよ(私にとっては)。 ヒントだけ別回答しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問