0

ユーザー、質問、無制限のレベルのカテゴリがあります。ユーザーは質問からいくつかのポイントを得ることができます。質問には複数のカテゴリを含めることができます。

私がやりたいのは、カテゴリごとのトップ ユーザーを計算することです。これは、そのカテゴリの下の質問から得られた合計ポイントと、サブカテゴリでもあります。

だから、私はこれらのテーブルを持っています:

questions
--------------
id
title
question

categories
--------------
id
parent_id
category
lft
rgt

question_categories
--------------
question_id
category_id

users
--------------
id
username

user_points
--------------
id
user_id
question_id
point_type
points

user_category
--------------
user_id
category_id
points    

私がやりたいのは、user_category.points の値を計算することです。各カテゴリのポイントを合計するのは簡単ですが、サブカテゴリを含めると複雑になります。

これを行う最良の方法は何ですか?

計算例:

カテゴリは次のとおりです。

Programming
   PHP
      Zend Framework
      Symfony
   Java
   Ruby on Rails

ユーザーがZend Framework から3 ポイント、PHP から2 ポイント、Java から5 ポイント、Rails から1 ポイントを得たとします。このユーザーのカテゴリごとのポイントは次のとおりです。

Programming            11 (5+5+1)
   PHP                  5 (2+3)
      Zend Framework    3
      Symfony
   Java                 5
   Ruby on Rails        1
4

4 に答える 4

1

おそらく、階層の代わりにタグを使用するのが最善でしょう。たとえば、「Zend Framework」を含むものには、「PHP」および「プログラミング」タグも含まれます。これは、一部のカテゴリが複数の場所に表示される場合にも役立ちます。たとえば、jQuery と Javascript で ajax を使用できます。次に、ユーザーのカテゴリにリストされている各タグに 1 を追加します。

于 2012-07-16T20:47:07.437 に答える
0

このphpとSQLは、サブカテゴリを含む各カテゴリの上位3人のユーザーを取得する必要があります。

$query = "SELECT id, parent_id FROM categories";
$parent = array();
...fetch mysql data loop depending on what connection you use, mysqli or pdo...
{
   $parent[$result['id']] = $result['parent_id'];
}

$childs = array();

foreach($parent as $id => $parrent_id)
{
   $childs[$parrent_id][$id] = $id;
   $next_parrent_id = $parrent_id;
   while($next_parrent_id = $parent[$next_parrent_id])
   {
      $childs[$next_parrent_id][$id] = $id;
   }
}

foreach($parent as $id => $parrent_id)
{
   $current_categories = array($id => $id) + $childs[$id];
   $query = "SELECT user_id, username, SUM(points) AS total_points
             FROM user_points 
             LEFT JOIN users ON (user_id = users.id)
             LEFT JOIN question_categories USING (question_id)
             WHERE category_id IN (" . implode(', ', $current_categories). ")
             ORDER BY total_points DESC
             LIMIT 3";
   ...fetch mysql data loop...
}
于 2012-07-16T21:18:21.427 に答える
0

、、およびのuser_categories3つの値を格納するテーブルを作成します。保守が簡単で(またはにのみ必要)、すべてのカテゴリのトップユーザーを簡単に照会できます。user_idcategory_iduser_scoreINSERTUPDATE

于 2012-07-16T20:45:28.490 に答える
0

最上位カテゴリごとに合計するだけの場合は、root_id (カテゴリの推移的な親の ID を保持する) というフィールドをカテゴリ テーブルに追加する必要があります。

次に、合計は次のように計算されます。

select up.user_id, ctg.root_id, sum(up.points)
from user_points up
join question_categories qc on up.question_id = qc.question_id
join categories ctg on qc.category_id = ctg.id
group by up.user_id, ctg.root_id
于 2012-07-16T21:07:30.140 に答える