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

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

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

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

SQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

1回答

348閲覧

Q&A掲示板を再帰結合SQLで書く場合テーブル構成はどのような形になるのでしょうか?

homepage-site

総合スコア60

phpMyAdmin

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

SQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

1クリップ

投稿2025/01/20 08:23

実現したいこと

Q&A掲示板の質問、回答、返信機能をツリー型で完成させたい。

発生している問題・分からないこと

再帰SQLが良いとアドバイス頂いたのですが、使い方が分からず悩んでおります。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

再帰SQLの説明を読むと、テーブルに一時的に名前を付けることで、再帰処理(ループ)を実現できるということなので、質問と回答を結び付けてそれを繰り返し表示する流れになると思うのですが、質問と回答、返信のテーブルは分けるべきでしょうか?

補足

※質問機能のテーブル構造
id (質問番号)
ts (投稿日時)
text (質問内容)
title (質問タイトル)
name (質問者名)
stamp (リアクションスタンプ)
unique_id (質問UUID)
ip (IPアドレス)
attach1 (アップロードされたファイル)
attach2 (アップロードされたファイル)
attach3 (アップロードされたファイル)
usericon (アップロードされたファイル)

※回答機能で保存予定のコンテンツ
アップロードされたファイル、名前、質問日時

※参考サイト
https://qiita.com/Shoyu_N/items/f1786f99545fa5053b75

https://www.letitride.jp/entry/2020/06/15/161826

※Q&A掲示板の設計図
https://marvelapp.com/whiteboard/urN35BK2SNIqAd9D5XwO

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

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

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

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

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

yambejp

2025/01/20 10:28 編集

参考テーブルをcreate table+insertで挙げてください 結果はUL-LI形式でほしいのでしょうか?
utm.

2025/01/20 10:40

内容が曖昧すぎませんか? 多分ほとんどの人がLEFT JOINなりで結合すればいいと思うと思うのですけど
homepage-site

2025/01/23 04:20

yambejpさん回答ありがとうございます。 見返してみたところ過去にコードを書いていたようですが、下記のコードで問題のある箇所などありますでしょうか? CREATE TABLE sortable ( id bigint(20) AUTO_INCREMENT PRIMARY KEY, parent_id bigint(20) , ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, text varchar(500) NOT NULL, title varchar(255) NOT NULL, name varchar(255) NOT NULL, stamp INT (11) NOT NULL, unique_id varchar(36) NOT NULL UNIQUE KEY default uuid(), ip varchar(39) NOT NULL, attach1 varchar(255) NOT NULL, attach2 varchar(255) NOT NULL, attach3 varchar(255) NOT NULL, usericon varchar(255) NOT NULL, FOREIGN KEY (parent_id) REFERENCES sortable(id) ); WITH RECURSIVE threads AS ( SELECT id, parent_id, ts, text, title, name, stamp, unique_id, ip, attach1, attach2, attach3, usericon, id AS top_id, CAST(id AS CHAR(255)) AS path, /* 1つのデータ型を互換性のある別のデータ型に変換 */ 0 AS depth /* 深さが0 = 親(質問)を取得する */ FROM sortable WHERE parent_id IS NULL UNION ALL SELECT s.id, s.parent_id, s.ts, s.text, s.title, s.name, s.stamp, s.unique_id, s.ip, s.attach1, s.attach2, s.attach3, s.usericon, t.top_id, CONCAT(t.path, '-', s.id) AS path, t.depth + 1 AS depth /* ひたすらに1を+していく */ FROM sortable s /* SELECT * FROM テーブル名 */ INNER JOIN threads t ON s.parent_id = t.id ) SELECT * FROM threads ORDER BY top_id DESC, path
homepage-site

2025/01/23 04:21

utm.さん回答ありがとうございます。 質問の内容が薄すぎました申し訳ありません。
guest

回答1

0

ベストアンサー

mysqlですとこんな感じに再帰処理を書きます

テーブルとビューの作成

sql

1create table messages ( 2id int(5) unsigned zerofill primary key, 3parent_id int null, 4content text 5); 6 7insert into messages values 8(1, NULL, '親1'), 9(2, 1, '子1'), 10(3, 1, '子2'), 11(4, 2, '孫1'), 12(5, 4, 'ひ孫1'), 13(6, 2, '孫2'), 14(7, 2, '孫3'), 15(8, 1, '子3'), 16(9, 8, '孫4'), 17(10, 1, '子4'), 18(11, NULL, '親2'), 19(12, 11, '子5'), 20(13, 12, '孫5'); 21 22drop view if exists test_view; 23create view test_view as 24with recursive threads as ( 25 select 26 id, 27 parent_id, 28 content, 29 id as top_id, 30 cast(id as char(255)) as path, 31 0 as depth 32 from messages 33 where parent_id is null 34 35 union all 36 select 37 t1.id, 38 t1.parent_id, 39 t1.content, 40 t2.top_id, 41 concat(t2.path, '-', t1.id) as path, 42 t2.depth + 1 as depth 43 from messages as t1 44 inner join threads as t2 on t1.parent_id = t2.id 45) 46select * from threads

階層表示

sql

1select id,concat(repeat("\t",depth),content) as content,path 2from test_view 3order by path

※idの長さ指定とpathのサイズは調整が必要です

投稿2025/01/21 01:13

yambejp

総合スコア117203

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

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

homepage-site

2025/01/28 13:39

yambejpさん回答ありがとうございます。 コードは別の形になってしまったのですが、参考にさせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問