2

我的网站上有一个积分系统,不同网站类别中的不同成就可以获得积分。类别可以有子类别和父类别,使用“category_relations”表,“links_to”和“links_from”字段包含相关的 category_id。

我想做的是获取当前类别中得分最高的前 5 名用户以及直接低于该类别的任何类别。

我的“points_awarded”表包含所有奖励积分的所有记录以及来自哪些类别的用户:

user_id,
points_amount, plus (tinyint boolean 是否加分),
minus (tinyint boolean 是否加分),
category_id

我真的不知道从哪里开始。我是否需要两个查询,一个用于获取所有子类别 ID,然后一个用于运行另一个查询以获取所用点的 SUM()?是否可以在一个查询中完成?

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 回答