首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MySQL计算两个表之间的月用户分数?

使用MySQL计算两个表之间的月用户分数?
EN

Stack Overflow用户
提问于 2012-06-18 14:41:50
回答 2查看 194关注 0票数 0

我发现了许多关于堆栈溢出的有用信息,但是仍然缺少一些信息来解决以下问题:

我有两个表:用户名分数用户名

代码语言:javascript
复制
#table userscores (saves userpoints each month) 

date          userid   points
2012-05-01    1        23
2012-06-01    1        34
代码语言:javascript
复制
#table userpoints (recent points) 

userid   points
1        23
2        10
3        15

我能够找到如何计算当前月份最近的用户名点与存储的用户名点之间的差异(来自“用户分数”表),方法是:

代码语言:javascript
复制
SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
    FROM `userpoints`,`userscores` 
    WHERE userpoints.userid=userscores.userid 
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
        AND userpoints.userid != ".$adminID."
    ORDER BY mpoints DESC;"

但是,这个查询只是比较来自表和的用户is,忽略了在表用户名点中存在但在表用户分数中不存在的userids

应该修改查询,以便新创建的userids (在表userpoint中)也被视为分数。

我了解了如何查询以获取表用户分数中不存在的userid:

代码语言:javascript
复制
 SELECT userpoints.userid FROM `userpoints` 
      WHERE userpoints.userid 
           NOT IN(SELECT qa_userscores.userid FROM `qa_userscores`)

现在我必须将这两种结合起来,但是尝试以下几种方法不起作用:

代码语言:javascript
复制
SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
FROM `userpoints`,`userscores` 
WHERE ( 
    userpoints.userid = userscores.userid
    AND YEAR(userscores.date) = YEAR(CURDATE()) 
    AND MONTH(userscores.date) = MONTH(CURDATE())
    AND userpoints.userid != ".$adminID."
)
OR ( 
    userpoints.userid IN(SELECT userpoints.userid FROM `userpoints` 
        WHERE userpoints.userid 
            NOT IN(SELECT DISTINCT userscores.userid FROM `userscores`)) 
)
ORDER BY mpoints DESC;

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-18 14:59:52

代码语言:javascript
复制
SELECT userpoints.userid, userpoints.points - coalesce(userscores.points,0) 
                                                 AS mpoints 
    FROM `userpoints`
    left join `userscores` on userpoints.userid=userscores.userid         
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
    where userpoints.userid != ".$adminID."
    ORDER BY mpoints DESC;"

即使在右侧没有相应的行时,左联接也会自动保留左侧的行。在右侧检查的所有条件都必须处于联接状态。最后,当ther是none时,需要为右侧值使用默认值。

票数 1
EN

Stack Overflow用户

发布于 2012-06-18 15:07:26

可以使用UNION组合来自两个查询的结果。

代码语言:javascript
复制
SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
    FROM `userpoints`,`userscores` 
    WHERE userpoints.userid=userscores.userid 
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
UNION 

SELECT userpoints.userid, points as mpoints FROM `userpoints` 
      WHERE userpoints.userid 
           NOT IN(SELECT userscores.userid FROM `userscores`)

有关使用mysql文档的更多信息,请参见UNION

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11085202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档