簡體   English   中英

使用MySQL計算兩個表之間的每月usercores?

[英]Calculate monthly userscores between two tables using MySQL?

我發現了很多有關stackoverflow的有用信息,但是仍然缺少一些解決以下問題的信息:

我有兩個這樣的表userscoresuserpoints

#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

我能夠找到如何使用以下方法計算當月的最近用戶點和已存儲用戶點之間的差異(來自表“ 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."
    ORDER BY mpoints DESC;"

但是,此查詢僅比較兩個表中的用戶ID ,而忽略用戶點中存在但表用戶分數中不存在的用戶ID

應該修改查詢,以便將新創建的用戶標識(在表用戶點中)也視為得分。


我發現了如何查詢以獲取表userscores中不存在的用戶ID:

 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;


任何幫助表示贊賞。

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時,您需要為Right Side值使用默認值。

您可以使用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`)

有關UNION用法的更多信息,請參見mysql文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM