2016-02-18 48 views
2

我有以下表格:如何使用集合函數從相關查詢中加入數據?

userActions: 
id | uId | goodAction | actionOverridden | dateAdded 

我寫了一個查詢來獲取:

  • 善行數(行,其中goodAction = 1
  • 不良行爲的數目(行,其中goodAction = 0
  • 被覆蓋的動作數(行數actionOverridden = 1


SELECT 

(SELECT COUNT(*) 
FROM userActions ua 
WHERE ua.goodAction = 0 AND ua.dateAdded > NOW() - INTERVAL 1 year AND ua.uId = 520) badActions, 

(SELECT COUNT(*) 
FROM userActions ua 
WHERE ua.goodAction = 1 AND ua.dateAdded > NOW() - INTERVAL 1 year AND ua.uId = 520) goodActions, 

(SELECT COUNT(*) 
FROM userActions ua 
WHERE ua.actionOverridden = 1 AND ua.dateAdded > NOW() - INTERVAL 1 year AND ua.uId = 520) actionOverrides 

上述查詢得到的數據與ID 520用戶,但我希望得到這個信息的所有用戶。通過上面的查詢,我需要獲取PHP中的用戶列表,然後遍歷列表並執行上面的查詢,注入用戶ID。

如何修改上述查詢以使其檢索所有用戶的數據?

我知道AND ua.uId = 520條件將需要從子查詢中刪除,我認爲GROUP BY ua.uId將用於子查詢以外,但我不知道該怎麼辦。

回答

5

可以使用CASE表達式來代替所有這些相關的查詢和使用GROUP BY得到像這樣所有用戶的結果:

SELECT t.uID, 
     sum(case when t.goodAction = 0 then 1 else 0 end) as badActions, 
     sum(case when t.goodAction = 1 then 1 else 0 end) as goodActions, 
     sum(case when t.actionOverridden = 1 then 1 else 0 end) as actionOverrides 
FROM userActions t 
WHERE t.dateAdded > NOW() - INTERVAL 1 year 
GROUP BY t.uID 
2

您可以通過UID將count和NULLIF和組:

SELECT t.uID, 
     COUNT(NULLIF(1, t.goodAction)) AS badActions, 
     COUNT(NULLIF(0, t.goodAction)) AS goodActions, 
     COUNT(NULLIF(0, t.actionOverridden)) AS actionOverrides 
FROM userActions t 
WHERE t.dateAdded > NOW() - INTERVAL 1 year 
GROUP BY t.uID;