2

私は現在、フォーラムを開発しようとしています。今、私は小さな障害に遭遇しました。データベースに 4 つのテーブルがあります。「カテゴリ」、「フォーラム」、「トピック」、「返信」です。それらはすべて、ID、親 ID、および名前を持っています。

私の問題は、各カテゴリとフォーラムのトピックと返信の量をどのように保存して取得するかです。最初は、すべてのカテゴリとフォーラムのすべてのトピックと返信を保存し、すべてのトピックのすべての返信を保存することを考えました。

しかし、返信ごとに1回の挿入と3回の更新を行う必要があるため、これは見ないようにしたいものです。カテゴリに 1 つ、フォーラムに 1 つ、トピックに 1 つ、最後に返信自体、挿入物です。

代わりに、COUNT、GROUP BY、およびINNER JOINを使用してクエリを作成することが可能かどうか(可能であればその方法)を考えました

線に沿った何か

SELECT * 
  FROM `categories`
  JOIN (COUNT ( * )
         FROM `topics`
     GROUP BY `parent_id`
        WHERE `parent_id` = `categories`.`id`) as `amount_of_topics`
  JOIN (COUNT ( * )
         FROM `topics`
     GROUP BY `parent_id`
        WHERE `parent_id` = `topics`.`id`) as `amount_of_replies`

ただ、思い通りに動かないだけです。

したがって、すべての返信を取得して特定のフォーラムの数をカウントするには、接続の返信とフォーラムが得たものは、返信のparent_idが、parent_idがフォーラムに属しているトピックに属しているということです。

4

2 に答える 2

3

あなたの質問を正しく理解しているかどうかはわかりませんが、特定のフォーラムのトピックと返信の数だけが必要な場合 (カテゴリがフォーラムに属し、その逆ではない場合)、この行に沿ってクエリを実行します。 :

SELECT  forums.ID as forum_id
,       forums.name as forum_name
,       Count(topics.ID) AS count_of_topics
,       Count(replies.ID) AS count_of replies
FROM forums 
    LEFT JOIN categories ON forums.ID = categories.parent_id 
    LEFT JOIN topics ON categories.ID = topics.parent_id 
    LEFT JOIN replies ON topics.ID = replies.parent_id
GROUP BY forums.ID, forums.name, categories.ID, categories.name;

カテゴリ別にトピックと返信の数を探している場合は、次を使用します。

SELECT  categories.ID as category_id
,       categories.name as category_name
,       Count(topics.ID) AS count_of_topics
,       Count(replies.ID) AS count_of replies
FROM categories
    LEFT JOIN topics ON categories.ID = topics.parent_id 
    LEFT JOIN replies ON topics.ID = replies.parent_id
GROUP BY forums.ID, forums.name, categories.ID, categories.name;

それが助けになることを願っていますが、それがあなたが達成しようとしているものでない場合は、質問に精度を追加してください。

于 2012-07-23T14:26:09.430 に答える
0

これはあなたが望むクエリだと思います:

SELECT categories.*, `amount_of_topics`, `amount_of_replies`
FROM `categories` JOIN
      (select `parent_id`, COUNT ( * ) as `amount_of_topics` 
       FROM `topics`
       GROUP BY `parent_id`
     )  tp
     on tp.`parent_id` = `categories`.`id`) JOIN
     (select `topics`.`id`) , COUNT ( * ) as `amount_of_replies`
      FROM `topics` 
      GROUP BY `topics`.`id`
    ) ti
    on  tp.`parent_id` = ti.`id`

アイデアは、必要なトピック グループごとに個別のサブクエリを作成し、それらを結合することです。

于 2012-07-23T14:48:44.717 に答える