2012-06-18 74 views
0

我發現了很多關於計算器有用的信息,但一點點仍然缺少解決了以下問題:使用MySQL計算兩個表之間的每月用戶內核?

我有兩個表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 

我能找出如何計算recen之間的差異采用t userpoints和存儲userpoints(來自表「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和忽視存在於表userpoints的用戶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; 


任何幫助表示讚賞。

回答

1
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沒有時,您需要爲右側值使用默認值。

+0

完美,非常感謝srini.venigalla!我將在我目前爲www.question2answer.org –

+0

寫的插件中讚揚你哦!我很榮幸,先生! –

0

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

相關問題