我的网站上有一个积分系统,可以获得不同网站类别中不同成就的积分。类别可以使用'category_relations'表来包含子类别和父类别,其中'links_to'和'links_from'字段包含相关的category_id。
我想要做的是获取当前类别中点数最多的前5位用户以及其下方的任何类别。
我的'points_awarded'表格包含所有获奖积分的记录以及来自哪些类别的用户:
USER_ID,
points_amount,
加(tinyint布尔值,如果它是否添加点),
减去(如果是点罚分,则为tinyint布尔值),
CATEGORY_ID
我真的不知道从哪里开始。我是否需要有两个查询,一个用于获取所有子类别ID,然后一个用于运行另一个查询来获取所用点的SUM()?是否可以在一个查询中执行此操作?
答案 0 :(得分: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成为签名字段?