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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2650閲覧

カテゴリ、ツリー構成の孫まであるものをHTML出力がどんなに悩んでもできません。

space_sss

総合スコア81

HTML5

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/06/04 12:19

編集2017/06/05 01:38

いつもお世話になっております。

今回のご質問なのですがカテゴリを最終的に

HTML

1<ul> 2 <li><a href="あああ">あああ(コンテンツ数)</a></li> 3 <li> 4 <dl> 5 <dt><a href="あああ">あああ(コンテンツ数)</a></dt> 6 <dd> 7 <ul> 8 <li><a href="いいい">-いいい(コンテンツ数)</a></li> 9 <li><a href="いいい">-いいい(コンテンツ数)</a></li> 10 <li><a href="いいい">-いいい(コンテンツ数)</a></li> 11 </ul> 12 </dd> 13 </dl> 14 </li> 15 <li><a href="あああ">あああ(コンテンツ数)</a></li> 16 <li> 17 <dl> 18 <dt><a href="あああ">あああ(コンテンツ数)</a></dt> 19 <dd> 20 <ul> 21 <li><a href="いいい">-いいい(コンテンツ数)</a></li> 22 <li> 23 <dl> 24 <dt><a href="いいい">-いいい(コンテンツ数)</a></dt> 25 <dd> 26 <ul> 27 <li><a href="ううう">-ううう(コンテンツ数)</a></li> 28 <li><a href="ううう">-ううう(コンテンツ数)</a></li> 29 <li><a href="ううう">-ううう(コンテンツ数)</a></li> 30 </ul> 31 </dd> 32 </dl> 33 </li> 34 <li><a href="いいい">-いいい(コンテンツ数)</a></li> 35 </ul> 36 </dd> 37 </dl> 38 </li> 39 <li><a href="あああ">-あああ(コンテンツ数)</a></li> 40</ul> 41

といった状態が最終形態となります。

テーブルの構成は

現在は
id(INT)
sub_id(varchar)←ツーリー構成の詳細
num(INT)←コンテンツ数
name(varchar)←コンテンツの名前
となっております。

実際には
id|sub_id|num|name|sort
|:--|:--:|--:|--:|
|01|/1/|10|あああ|1|
|02|/2/|10|あああ|2|
|03|/2/3/|10|いいい|1|
|04|/2/4/|10|いいい|2|
|05|/2/5/|10|いいい|3|
|06|/6/|10|あああ|3|
|07|/7/|10|あああ|4|
|08|/7/8/|10|いいい|1|
|09|/7/9/|10|いいい|2|
|10|/7/9/10/|10|ううう|1|
|11|/7/9/11/|10|ううう|2|
|12|/7/9/12/|10|ううう|3|
|13|/7/13/|10|いいい|1|
|14|/14/|10|あああ|5|

このように上から順番がキレイになっていたらアレですけどもテーブルも乱雑になっている場合どうすればいいのでしょうか?
例えば
id|sub_id|num|name|sort
|:--|:--:|--:|--:|
|01|/1/|10|あああ|1|
|02|/2/|10|あああ|2|
|03|/3/|10|あああ|3|
|04|/4/|10|あああ|4|
|05|/5/|10|あああ|5|
|06|/2/6/|10|いいい|1|
|07|/2/7/|10|いいい|2|
|08|/2/8/|10|いいい|3|
|09|/4/9/|10|いいい|1|
|10|/4/10/|10|いいい|2|
|11|/4/11/|10|いいい|3|
|12|/4/10/12/|10|ううう|3|
|13|/4/10/13/|10|ううう|1|
|14|/4/10/14/|10|ううう|2|

一応取得に関しては問題なくできすべて後は並べるだけだとは思いますが。。。
どなたかご教授宜しくお願いいたします。
一応考えたのが
foreachを親、子、孫とかけて孫にいくにつれて中で中に入れることぐらいしか想像がつきません。。。

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

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

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

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

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

guest

回答2

0

ベストアンサー

  • なぜ最初の階層はul-liなのに、2段目はdl-dt-ddとなり

3段目でul-liにもどっているのでしょうか?

  • コンテンツ数とは何を指しますか?
  • 13番目の要素のidが14で、14番目の要素とかぶっていますがよいのですか?

基本的にご提示されている「経路列挙モデル」より「隣接モデル」で
データをもち「入れ子集合モデル」に変換して利用するほうがラクです

隣接モデルのsample

隣接モデルでは、親のidだけ保存します。
親がいない=NULLが先頭になります
(入れ子集合モデル用にlevelと、l(左)、r(右)を用意してあります)

SQL

1CREATE TABLE tbl(id INT NOT NULL UNIQUE, 2parent_id INT NULL, 3name varchar(64), 4sort int, 5level int NOT NULL, 6l int not null, 7r int not null); /*修正*/ 8 9INSERT INTO tbl(id,parent_id, name,sort) VALUES 10(1,null,'0',1), 11(2,null,'1',2), 12(3,2,'1-1',3), 13(4,2,'1-2',4), 14(5,2,'1-3',5), 15(6,null,'2',6), 16(7,null,'3',7), 17(8,7,'3-1',8), 18(9,7,'3-2',9), 19(10,9,'3-2-1',10), 20(11,9,'3-2-2',11), 21(12,9,'3-2-3',12), 22(13,7,'3-3',13), 23(14,null,'4',14);
idparent_idnamesortlevellr
1NULL01000
2NULL12000
321-13000
421-24000
521-35000
6NULL26000
7NULL37000
873-18000
973-29000
1093-2-110000
1193-2-211000
1293-2-312000
1373-313000
14NULL414000

入れ子集合モデルのsample(プロシージャをPHPに置き換え版)

SQLのプロシージャがどうしても作れないのであれば、以下PHPで代替できます

PHP

1 $pdo->beginTransaction(); 2 $sql ="UPDATE tbl SET level=0,l=0,r=0;\n"; 3 $stmt= $pdo->query($sql); 4 $sql ="UPDATE tbl SET level=1,l=(SELECT @a:=@a+1 FROM (SELECT @a:=0) AS sub),r=@a:=@a+1 WHERE parent_id IS NULL ORDER BY id;"; 5 $stmt= $pdo->query($sql); 6 $sql ="SELECT id FROM tbl WHERE level=0 ORDER BY parent_id ASC,id DESC;"; 7 $stmt2 = $pdo->query($sql); 8 while($row=$stmt2->fetch()){ 9 $sql ='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a1.l=a2.l+1,a1.r=a2.l+2,a1.level=a2.level+1,a2.r=a2.r+2,a3.r=a3.r+2 WHERE a1.parent_id=a2.id AND a2.l<a3.r AND a1.id=?;'; 10 $stmt = $pdo->prepare($sql); 11 $stmt->execute([$row["id"]]); 12 $sql ='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a3.l=a3.l+2 WHERE a1.parent_id=a2.id AND a2.l<a3.l and a3.id!=a1.id AND a1.id=?;'; 13 $stmt = $pdo->prepare($sql); 14 $stmt->execute([$row["id"]]); 15 } 16 17 $sql ='SELECT name,level,(SELECT COUNT(*)-1 FROM tbl AS t2 WHERE t2.l BETWEEN t1.l AND t1.r) AS child FROM tbl AS t1 ORDER BY l;'; 18 $stmt = $pdo->query($sql); 19 $rows=$stmt->fetchAll(); 20 $pdo->commit();// 実はロールバックしてもOK $pdo->rollback(); 21

入れ子集合モデルのsample

隣接モデルを入れ子集合モデルに変換するために
以下のプロシージャを作っておきます。

SQL

1DROP PROCEDURE IF EXISTS SET_LR; 2DELIMITER // 3CREATE PROCEDURE SET_LR() 4BEGIN 5DECLARE a INT DEFAULT 0; 6DECLARE done INT DEFAULT 0; 7DECLARE CUR CURSOR FOR 8SELECT id FROM tbl WHERE level=0 ORDER BY parent_id ASC,sort DESC,id DESC; 9DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 10UPDATE tbl SET level=0,l=0,r=0; 11/* level,l,rを初期化*/ 12 13UPDATE tbl SET level=1,l=(SELECT @a:=@a+1 FROM (SELECT @a:=0) AS sub),r=@a:=@a+1 14WHERE parent_id IS NULL 15ORDER BY sort ASC,id ASC; 16/* 先頭データのlevelを1とし、l,rを1ずつ足していく*/ 17 18OPEN CUR; 19REPEAT 20FETCH CUR INTO a; 21IF NOT done THEN 22SET @id=a; 23SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a1.l=a2.l+1,a1.r=a2.l+2,a1.level=a2.level+1,a2.r=a2.r+2,a3.r=a3.r+2 WHERE a1.parent_id=a2.id AND a2.l<a3.r AND a1.id=?'; 24/* 子のlに親の1+1、子のrに親のl+2,子のlevelに親のlevel+1親のrを2増やす、親のlより大きいrを2増やす */ 25 26PREPARE stmt from @sql; 27EXECUTE stmt USING @id; 28SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a3.l=a3.l+2 WHERE a1.parent_id=a2.id AND a2.l<a3.l and a3.id!=a1.id AND a1.id=?'; 29/* 親の1より大きいlの内、子以外のものを2増やす */ 30 31PREPARE stmt from @sql; 32EXECUTE stmt USING @id; 33END IF; 34UNTIL done END REPEAT; 35CLOSE CUR; 36END 37// 38DELIMITER ; 39

プロシージャの呼び出し
元データを追加・削除・更新する度にプロシージャを呼び出してコンバートしてください

SQL

1CALL SET_LR;

※プロシージャ実行後

idparent_idnamesortlevellr
1NULL01112
2NULL121310
321-13245
421-24267
521-35289
6NULL2611112
7NULL3711326
873-1821415
973-2921623
1093-2-11031718
1193-2-21131920
1293-2-31232122
1373-31322425
14NULL41412728

nameを階層で表示し、含まれる子要素数を表示
COUNT1は直接の子要素数のみ、COUNT2は孫以降の要素数も含む

SQL

1SELECT * FROM tbl ORDER BY l

phpでデータをあつめて
$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
としたとき

PHP

1$indent=3; 2$l1=0; 3foreach($rows as $key=>$row){ 4 $l2=$row["level"]; 5 $l3=($key<count($rows)-1)?$rows[$key+1]["level"]:0; 6 if($l1>=$l2){ 7 print str_repeat(" ",($l2-1)*$indent); 8 } 9 if($l1<$l2){ 10 print PHP_EOL; 11 print str_repeat(" ",($l2-1)*$indent); 12 print "<ul>".PHP_EOL; 13 print str_repeat(" ",($l2-1)*$indent); 14 } 15 print "<li>"; 16 print $row["name"]; 17 if($l2==$l3){ 18 print "</li>".PHP_EOL;; 19 } 20 if($l2>$l3){ 21 print "</li>".PHP_EOL; 22 for($i=$l2-$l3-1;$i>0;$i--){ 23 print str_repeat(" ",($i)*$indent); 24 print "</ul>".PHP_EOL; 25 print str_repeat(" ",($i-1)*$indent); 26 print "</li>".PHP_EOL; 27 } 28 print str_repeat(" ",($l3)*$indent); 29 print "</ul>".PHP_EOL; 30 } 31 $l1=$l2; 32} 33

ついでなので子要素の数を調べるにはこうです

SQL

1SELECT name,level,(SELECT COUNT(*)-1 FROM tbl AS t2 WHERE t2.l BETWEEN t1.l AND t1.r) AS child FROM tbl AS t1 ORDER BY l

これを上記PHPの「print $row["name"];」の下の行に以下を追記するだけです

PHP

1 if($row["child"]>0) print "(".$row["child"].")";

投稿2017/06/05 01:12

編集2017/06/07 03:45
yambejp

総合スコア114769

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

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

space_sss

2017/06/05 01:24

ご解答ありがとうございます! >>なぜ最初の階層はul-liなのに、2段目はdl-dt-ddとなり 3段目でul-liにもどっているのでしょうか? 子や孫をもつもののみdlでくくって表示させようと考えておりました! >>コンテンツ数とは何を指しますか? こちらは一応ブログコンテンツのシステムを作る為に作成しており各カテゴリに対していくつの投稿記事があるかを示しております! >>13番目の要素のidが14で、14番目の要素とかぶっていますがよいのですか? ご指摘ありがとうございます!こちらは記入ミスでした。修正させていただきました。 >>基本的にご提示されている「経路列挙モデル」より「隣接モデル」で データをもち「入れ子集合モデル」に変換して利用するほうがラクです そういった種類があるのですね。 そちらに関しては知識不足でした。。 そちらに関しては調べてみます。
yambejp

2017/06/05 03:14

階層モデルのsample挙げておきました
space_sss

2017/06/05 03:49

ご解答ありがとうございます。 上から順番に確認させていただいております。 プロシージャを作るやプロシージャの呼び出し等記載されていますがこれはいったい何なのでしょうか? 一応調べたのですがつかったことのなかったものなので... 文面的にはリセットや整理するものなのかな?とは思うのですが... どのように実行されるようなものなのでしょうか? 質問ばかりで大変申し訳ありません。
yambejp

2017/06/05 03:56

タグに「phpMyAdmin」があったのでMySQLの質問と認識していましたが 違いましたか? プロシージャとはSQLで動かすプログラムです。(正確にはストアドプロシージャ) 私が提示したものをphpMyAdminで、当該するデータベース上のコンソールに はりつけて実行すれば、プロシージャが登録されます。 以降そのプロシージャを呼び出せば、定形の処理がされるわけです。 今回は、テーブルのコンバートをプロシージャでやっています。 参考: https://dev.mysql.com/doc/refman/5.6/ja/stored-routines.html https://dev.mysql.com/doc/refman/5.6/ja/create-procedure.html
space_sss

2017/06/05 04:19

ご丁寧に画回答ありがとうございます! 質問内容は間違いありません! ストアドプロシージャといった言葉を聞いたことがわりませんでした。大変申し訳ありません。 コンソールとは後黒い画面のことののでしょうか? 今までphpadminを使用する際黒い画面自体を使用したことがなかったのですがそちらに上記のものをいれ実行するとプロシージャが登録されるといった事なのでしょうか?
yambejp

2017/06/05 04:54

phpMyAdminの場合は、黒くはないと思います DBを選んだ状態で「SQL」タブを押すと 「クエリを実行する」という入力エリアが表示されるので そこに貼り付けて「実行」してください 最近のphpMyAdminであれば、どんなプロシージャが登録されているか 可視化できる仕組みになっているはずです
退会済みユーザー

退会済みユーザー

2017/06/05 15:42

横レス失礼します。 > 「ストアドプロシージャといった言葉を聞いたことがわりませんでした。」って書かれていますが・・・ こちらの質問への回答で書かれていますね。あなたの質問ですよ。 https://teratail.com/questions/63426
space_sss

2017/06/05 16:23

>>phpMyAdminの場合は、黒くはないと思います DBを選んだ状態で「SQL」タブを押すと 「クエリを実行する」という入力エリアが表示されるので そこに貼り付けて「実行」してください 最近のphpMyAdminであれば、どんなプロシージャが登録されているか 可視化できる仕組みになっているはずです 反応が遅れてしまい大変申し訳ありません。。 SQL文で入力したのですが下記のエラーがでてしまして、 SQL query: DELIMITER ; MySQL のメッセージ: ドキュメント #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1 もしかしたらSQL部分に直接入力することではないのか?と思いまして。。
space_sss

2017/06/05 16:26

>>Kosuke_Shibuya様 以前質問させていただいた回答に記載されていましたね。 後で調べようと思っていましたが放置気味になってしまっていました。 せっかく回答いただいたのに理解できず大変申し訳ない気持ちです。 そちらもこの機会にしっかり勉強したいと思います・・・
yambejp

2017/06/06 00:27

あれ、おかしいですね 「DROP PROCEDURE IF EXISTS SET_LR;」から 「DELIMITER ;」まで今回ですと38行コピーして ペーストするだけでいけるはずなんですけど・・・ ちなみにMySQLのバージョンはいくつをご利用ですか?
space_sss

2017/06/06 12:10

MySQLのバージョンは5.7.18です! もしかして隣接モデルのsampleが実行できなかったので予想で最後の行の int not null); を r int not null); にしてしまったからでしょうか??
yambejp

2017/06/06 12:53 編集

すみませんtypoです。 「r int not null);」が正しいので修正しました。 一応ただしく動いた場合のリストの状況を載せました。 MySQLの5.7ならストアド・プロシージャは利用できるので 問題ないはずなのですけどね・・・ ついでなので、子要素数のとり方も追記して最終形まで記載しておきました なんとかプロシージャを動かせると良いのですが・・・
yambejp

2017/06/07 03:46

改めて・・・ プロシージャを使用せず、すべてphp側で処理をする方法を途中に追記しました
space_sss

2017/06/07 11:18

返信が遅れてもうしわけありません... もう一度実行して試してみます!
space_sss

2017/06/07 12:04

連絡が遅れましたが もう一度phpadminのSQLで上記のものをたたきましたがやはり SQL query: DELIMITER ; MySQL のメッセージ: ドキュメント #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1 とエラーが出てしまいます。 ただページを更新してみるとプロシージャといった項目が追加されていました! BEGIN DECLARE a INT DEFAULT 0; DECLARE done INT DEFAULT 0; DECLARE CUR CURSOR FOR SELECT id FROM tbl WHERE level=0 ORDER BY parent_id ASC,sort DESC,id DESC; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; UPDATE tbl SET level=0,l=0,r=0; /* level,l,rを初期化*/ UPDATE tbl SET level=1,l=(SELECT @a:=@a+1 FROM (SELECT @a:=0) AS sub),r=@a:=@a+1 WHERE parent_id IS NULL ORDER BY sort ASC,id ASC; /* 先頭データのlevelを1とし、l,rを1ずつ足していく*/ OPEN CUR; REPEAT FETCH CUR INTO a; IF NOT done THEN SET @id=a; SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a1.l=a2.l+1,a1.r=a2.l+2,a1.level=a2.level+1,a2.r=a2.r+2,a3.r=a3.r+2 WHERE a1.parent_id=a2.id AND a2.l<a3.r AND a1.id=?'; /* 子のlに親の1+1、子のrに親のl+2,子のlevelに親のlevel+1親のrを2増やす、親のlより大きいrを2増やす */ PREPARE stmt from @sql; EXECUTE stmt USING @id; SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a3.l=a3.l+2 WHERE a1.parent_id=a2.id AND a2.l<a3.l and a3.id!=a1.id AND a1.id=?'; /* 親の1より大きいlの内、子以外のものを2増やす */ PREPARE stmt from @sql; EXECUTE stmt USING @id; END IF; UNTIL done END REPEAT; CLOSE CUR; END といった定義になったので問題なく成功したように思えます!
yambejp

2017/06/08 00:20

前回提示したとおりPHPで代替することもできます プロシージャもしくはPHPでコンバートした上で 最終型のUL-LIの構造で問題ないか確認ください 構造が問題なければCSSや整形し、場合によっては javascriptで動きをつけることになると思います
space_sss

2017/06/08 17:05

ありがとうございます! 問題なく表示等も完了いたしました! 長々とした質問となってしまいましたがお付き合いいただきましてありがとうございます! 今回この事により 入れ子集合モデルといったものを学ぶことができました! 本当に感謝いたします!
guest

0

せっかくなのでヒントだけにとどめておきます。

sql

1CREATE TABLE `table` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'プライマリーキー', 3 `parentId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '親ID', 4 `orderNumber` int(11) unsigned NOT NULL COMMENT '表示順', 5 `label` varchar(32) NOT NULL DEFAULT '' COMMENT 'ラベル', 6 PRIMARY KEY (`id`), 7 UNIQUE KEY `label` (`label`), 8 KEY `parentId` (`parentId`), 9);

投稿2017/06/04 13:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

space_sss

2017/06/04 17:35

いつもご解答ありがとうございます。 実力不足で、こちらがどうヒントになっているかが全く想像つきませんでした。 他にも何かヒントをいただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問