我发现了许多关于堆栈溢出的有用信息,但是仍然缺少一些信息来解决以下问题:
我有两个表:用户名分数和用户名:
#table userscores (saves userpoints each month)
date userid points
2012-05-01 1 23
2012-06-01 1 34#table userpoints (recent points)
userid points
1 23
2 10
3 15我能够找到如何计算当前月份最近的用户名点与存储的用户名点之间的差异(来自“用户分数”表),方法是:
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:
SELECT userpoints.userid FROM `userpoints`
WHERE userpoints.userid
NOT IN(SELECT qa_userscores.userid FROM `qa_userscores`)现在我必须将这两种结合起来,但是尝试以下几种方法不起作用:
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;任何帮助都很感激。
发布于 2012-06-18 14:59:52
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时,需要为右侧值使用默认值。
发布于 2012-06-18 15:07:26
可以使用UNION组合来自两个查询的结果。
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。
https://stackoverflow.com/questions/11085202
复制相似问题