0

ソーシャル ネットワーク サイトのすべてのコメント用に 1 つのテーブルを作成しました。

また、1 つのコメントに割り当てられたすべてのコメントのテーブルが 1 つあります。

そこで、各セクション タイプ (画像、ユーザー ページ、グループなど) に簡単に実装できるように、関数 comment() を作成しました。$_GET['s']==user の場合、ウォールポストとこれらのウォールポストへのコメントが必要です。すべて「コメント」に保存されます。

私はこれを表示するためにこのスキームを持っています: 1. コメントを取得する sql クエリ 2. html 出力 3. この html 出力内の別の sql クエリで、コメントの指定された割り当てられたコメント (この場合はウォールポスト) を取得します。

問題は、最初のクエリですべてのコメントが表示されることです。また、サブコメントであるはずのコメント。したがって、私の質問は、この最初のクエリで指定する方法がある場合、すべてのコメントを取得したときに、次のように言うことです。その場合は、このコメントを表示しないでください。これはサブコメントであるためです (上記の手順 3 で表示します)。

もしかしたら、この構造全体が変更される可能性がありますか?提案をいただければ幸いです。実現するのも難しいですが、どれが最も効率的でしょうか。


テーブル構造:

コメント

id、uid、nid、サイト、テキスト、日付

comment_assign

comment_id、assign_id


最初の SQL クエリの例。これは、すべてのコメント (割り当てられたコメントも) を表示しないようにするために機能しません。最後の行を参照してください。

SELECT *    
FROM `comments` AS c
LEFT JOIN `comment_assign` AS ca ON ca.`comment_id` = c.`id` 
LEFT JOIN `users` AS u ON c.`uid` = u.`id` 

WHERE c.`nid`='".$nid."' 
AND c.`site`='".$_GET['s']."' 
AND ca.`comment_id` != c.`id`
4

1 に答える 1

1

私の理解が正しければ、コメントテーブルからすべてのコメントを選択してください。次に、comment_assign.comment_id に comment.id が存在するかどうかを確認します。存在する場合、それはサブコメントです。あれは正しいですか?

これには 2 つの方法があります。クリーンな方法は、コメントテーブルに別のフィールドを追加してそこに assign_id を配置することです。これは、各コメントは別のコメントにのみ関連付けることができるか、最上位のコメント (*assign_id は NULL*) であるためです。

または、両方のテーブルを LEFT JOIN することもできます。assign_id が NULL であるすべての行はウォール コメントです。値を持つすべての行は、サブコメントとして割り当てられていることを意味します。すなわち

SELECT id, uid, site, text, date
FROM comment
LEFT JOIN comment_assign ON (comment.id = comment_assign.comment_id)
WHERE comment_assign.assign_id IS NULL;
于 2012-10-02T14:23:39.297 に答える