2

私のウェブサイトにはポイントシステムがあり、さまざまなウェブサイトカテゴリ内のさまざまな成果に対してポイントが獲得されます。カテゴリには、関連するcategory_idを保持する「links_to」フィールドと「links_from」フィールドを持つ「category_relations」テーブルを使用して、サブカテゴリと親カテゴリを含めることができます。

私がやりたいのは、現在のカテゴリとそのすぐ下のカテゴリで最も多くのポイントを持つ上位5人のユーザーを取得することです。

私の「points_awarded」テーブルには、付与されたポイントのすべてのレコードと、どのカテゴリのどのユーザーに与えられたものが含まれています。

user_id、
points_amount、プラス(ポイントが追加されているかどうかに関係なく、
tinyintブール値)、マイナス(ポイントペナルティであるかどうかに関係なく、tinyintブール値)、
category_id

どこから始めたらいいのかわからない。2つのクエリが必要ですか?1つはすべてのサブカテゴリIDをフェッチし、もう1つはそれを使用して別のクエリを実行して使用されるポイントのSUM()をフェッチしますか?1つのクエリでそれを行うことは可能ですか?

4

1 に答える 1

2

確かにデータベーステーブルに関する詳細情報が必要ですが、このようなものはおそらく機能します。

SELECT 
    `user_id`, 
    SUM(IF(`plus`, `points_amount`, 0)) - SUM(IF(`minus`, `points_amount`, 0)) AS `points`
FROM 
    `points_awarded`
WHERE
    `user_id` = $user_id
    AND (
        `category_id` = $cat_id
        OR `category_id` IN(
            SELECT `links_to`
            FROM `category_relations`
            WHERE `links_from` = $cat_id
        )
    )
GROUP BY `user_id`

興味がありますが、なぜプラスフィールドとマイナスフィールドがあるのですか?プラスが偽の場合、マイナスであると想定できませんか?とにかくどちらかのフィールドがあるのはなぜですか、points_amountを署名付きフィールドにしないのはなぜですか?

于 2012-05-17T10:18:26.303 に答える