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

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

新規登録して質問してみよう
ただいま回答率
85.37%
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スクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

445閲覧

Q&A掲示板で質問と回答と返信を識別するにはどちらの方法が良いでしょうか?

homepage-site

総合スコア48

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スクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2024/08/31 13:52

実現したいこと

Q&A掲示板の質問と回答と回答に対する返信を両用データベースで作成したいと考えております。

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

➀、➁のどちらが適しているかアドバイスお願い致します。

※➀、➁両方に共通する処理
どの質問に対しての回答なのか紐づけのために質問ID(親ID)を設定する。

方法➀
識別用のカラムを持たせる方法で質問を「1」、回答を「2」のように意味付けて識別する。

方法②
親IDが NULL(紐づけられていない)のものを質問として、親IDが設定されているものを回答とする。

該当のソースコード

特になし

試したこと・調べたこと

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

方法②の両用テーブルでのプログラム処理は下記のようになると予測しております。
回答に対する返信機能も付けたい場合、この方法は適していないのではないかと考えました。
回答IDで判断する場合2択しかなく3つめの選択肢がないからです。

※質問か回答かの判断について
質問回答テーブルを質問IDで参照しそのデータが質問であれば質問の出力を編集、そのデータが回答であれば回答の出力を編集。質問と回答を合わせて1件以上のループ処理。
質問:回答IDがNULLである
回答:回答IDがNULLでない

補足

特になし

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

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

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

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

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

guest

回答2

0

前の質問で、「回答にさらに回答が付くことがある」というような話だったようなので、2一択ではないかと思います。

また、そのようにするのであれば「質問」と「回答」というような意味付けをやめて、メッセージはメッセージとして、単なるそれらの前後関係とか親子関係のようにとらえて属性付けして管理していくのがいいのではないかと思います。そうした場合、前(親)が無いものが原始(root)のメッセージというような考えかたになるでしょう。

投稿2024/08/31 14:33

TakaiY

総合スコア13687

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

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

homepage-site

2024/08/31 16:03

TakaiYさんアドバイスありがとうございます、方法➀で考えていたのですが方法➁の方がいいんですね。 親子関係でテーブルを考えてみます。
guest

0

ベストアンサー

テーブル構成としては②で良くて、親IDを利用した自己結合が必要になってくるはずです。

何段階でも返信ができるようにするのであれば、WITH RECURSIVE をつかった結合を利用すると
一度にデータを抽出できます。
ただSQLとしてはちょっとややこしくなるので、返信できる深さの上限を決めて複数回のSELECTを行う、でも良いとは思います。

テーブルの例

sql

1CREATE TABLE messages ( 2 id INT AUTO_INCREMENT PRIMARY KEY, 3 parent_id INT NULL, 4 content TEXT, 5 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 6 FOREIGN KEY (parent_id) REFERENCES messages(id) 7); 8 9INSERT INTO messages (id, parent_id, content) VALUES (1, NULL, 'これは親メッセージです'); 10INSERT INTO messages (id, parent_id, content) VALUES (2, 1, 'これは親メッセージへの返信です'); 11INSERT INTO messages (id, parent_id, content) VALUES (3, 1, '親メッセージへの別の返信です'); 12INSERT INTO messages (id, parent_id, content) VALUES (4, 2, 'これは最初の返信への返信です'); 13INSERT INTO messages (id, parent_id, content) VALUES (5, NULL, 'これは別の親メッセージです'); 14INSERT INTO messages (id, parent_id, content) VALUES (6, 5, '2つ目の親メッセージへの返信です'); 15INSERT INTO messages (id, parent_id, content) VALUES (7, 6, '2つ目の親メッセージの返信への返信です');

SELECTの例

sql

1WITH RECURSIVE threads AS ( 2 SELECT 3 id, 4 parent_id, 5 content, 6 created_at, 7 id AS top_id, 8 CAST(id AS CHAR(255)) AS path, 9 0 AS depth 10 FROM messages 11 WHERE parent_id IS NULL 12 13 UNION ALL 14 SELECT 15 m.id, 16 m.parent_id, 17 m.content, 18 m.created_at, 19 t.top_id, 20 CONCAT(t.path, '-', m.id) AS path, 21 t.depth + 1 AS depth 22 FROM messages m 23 INNER JOIN threads t ON m.parent_id = t.id 24) 25SELECT * FROM threads 26ORDER BY top_id DESC, path

投稿2024/08/31 22:44

Eggpan

総合スコア3203

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

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

homepage-site

2024/09/02 13:06 編集

Eggpanさん回答ありがとうございます、返信が遅れてしまい申し訳ありません。 返信できる深さについて悩んでいるのですが、深さに上限を設けた場合それ以上返信できなくなり、改めて質問に回答することになるので、深さの意味がなくなることが想定されます。 質問への回答、回答への返信などが入り乱れるので、ツリー型は実装したいです。 対策としてリンク又はボタンを表示しておいて、続きを見る際にアクションが必要という形にすることで解決するのではと考えました。 それが可能であれば無限の深さでも良いのではないかと思っているのですが、Eggpanさんならどうされますでしょうか?
Eggpan

2024/09/02 13:05

回答への返信の返信まで表現したいのであれば無制限になっちゃうんじゃないかと思います。 あるいはteratailと同様に、回答の返信までは表示するとかですかね。 それ以上、4段階以上の中途半端な深さまで許可すると、ネストが深くなった段階で急に返信ボタンが出なくなるなどの状態が想定され、利用ユーザーがなぜ返信できないのかが分からなくなりそうです。
homepage-site

2024/09/02 13:16

Eggpanさんアドバイスありがとうございます。 予想外の数でした… ライブドアまとめブログのようにツリー数は無制限ではあるが、コードが複雑化するので深くしないという意味だと思っておりました。 SQLだけで返信機能を作成した場合に4段階以上はエラーが起こりうるという事でしょうか?
Eggpan

2024/09/03 04:08

別にエラーは起きませんが、有限で中途半端な段階まで許可するとUI設計で困りませんか? ユーザーが混乱しなければ良いのかなとは思います。
homepage-site

2024/09/03 05:33

Eggpanさん回答ありがとうございます、あまり長くしすぎるとユーザー側も見にくいことは考えられますね。 ライブドアブログやYoutubeのようにコメントをツリー構造にして盛り上がるようにした方が既存のサイトと差別化できると考えていたんですが…
homepage-site

2024/09/08 11:02

Eggpanさんに1つお聞きしたいのですが、CAST(id AS CHAR(255)) AS path は id を何故 CHAR型にしたのでしょうか? VARCHAR型にするという選択肢もある中で理由をお聞きしたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問