2017-05-04 6 views
1

ネストされたコメントを表示するための効率的な方法を作成するために、私は1つのクエリで行うことができると考えています。ネストされたコメントの単一クエリ

簡体コメントテーブル

CREATE TABLE comment (
comment_id int unsigned primary key auto_increment, 
date int unsigned, 
parent_id int unsigned, 
comment text); 

明確にするため、コメントはdate ASCが発注されることになります。コメントにparent_idがヌルでない場合、それはネストされたコメントであることを意味します。このparent_idは、上記のコメント 'parent comment_idを参照しています。

この後半は難しいところです。誰か私はこれを行うには、単一のMySQLクエリを思いつくことができますか?

は、次のコードは、効率的な方法であなたの第二の必要性に応える必要がありますあなたの

答えて

1

ありがとう:

CREATE TABLE comment(
comment_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
date INT UNSIGNED, 
parent_id INT UNSIGNED DEFAULT NULL, 
commend TEXT, 
FOREIGN KEY fk_parent(parent_id) 
REFERENCES comment(comment_id) 
ON UPDATE CASCADE 
ON DELETE RESTRICT) 

は、あなただけのために子コメントは親コメントの前に挿入されていないことを確認したいです外部キー参照。

ただし、テーブルを日付順に並べ替える場合、MySQL CREATE TABLE構文にはそのような機能は含まれていないため、クエリの実行中にORDER BYを有効に実装すると効果的です。ただし、後でテーブルを変更して日付順に並べ替えることを選択した場合、この変更を行った操作はこのオーダーに従わないことに注意してください。具体的には:

ALTER TABLE comment ORDER BY date ASC 

は、テーブルに現在のデータのみを入力し、後続のデータは入力しません。

また、要件に応じて、intではなくDATEデータ型を使用することを検討してください。

+0

ありがとう、私は返信を感謝します。残念ながら、私はFOREIGN KEYを使用することに慣れていませんし、そうすることの意義(上記のテーブルに対するサイズ/効率/無関係なクエリへの影響)を考慮するにはもう少し時間が必要です。私は、別の方法に頼らずに、単一のクエリでこれをきれいに行う方法があることを期待していました。これが1つの解決策であると信じるか、またはすべての可能性の中から最も効果的で効率的な解決策であると信じていますか?ありがとうございました。 – Bogdan

+1

外部キーは、親コメントがデータベースに存在することを保証するものではありません。また、親コメントを検索したいときに簡単にクエリを行うことができます。あなたが日付列をインデックス化する限り、注文が進む限り、私はあなたがALTER TABLEに頼る必要はないと思っています。なぜなら、問い合わせ中の注文は安くなければならないからです。しかし、一般的には、効果的な管理のためにデータベースの索引付けと制約を理解することは良いことです。これが助けて欲しい! – YashTD

関連する問題