2013-06-01 27 views
0

我正在嘗試根據用戶的點數來計算用戶的點數,這些用戶的點數與VS的值和VS在一週內可以擁有的最大數量有關。SQL SUM關閉參數

這是一個日記系統。他們每天都進入他們參與的所有活動。IE:騎自行車。他們每天都可以登錄,但我們只希望每個活動每週給他們X點。

的表格:

點 - 保存每一天,每一個活動(VALUEID)的條目(日記帳分錄)

價值觀 - 包含所有可能的活動,他們可以選擇

用戶 - 擁有參與日誌

valueID, valueName, value, maxWeekValue 
1, Biking, 1, 6 

pointID, userID, valueID, date_created 
1, 16, 1, 2013-05-19 
2, 16, 1, 2013-05-20 
3, 16, 1, 2013-05-21 
4, 16, 1, 2013-05-22 
5, 16, 1, 2013-05-23 
6, 16, 1, 2013-05-24 
7, 16, 1, 2013-05-25 

userID, name 
16, Braden 

雜誌用戶: 5/19-5/25 =我騎自行車,每天記錄。我一個星期內只能得到6的最大點數,所以它應該讀取我的總點數爲6.

我需要一個SQL語句,它將採取每個帖子,按值分組,給出值*條目的總和如果< maxWeekValue。

我可以在PHP中做到這一點。但我知道在mySQL中有這樣一種更簡潔的方法。

這是我到目前爲止有:

SELECT p.valueID,p.date_created,v.valueName,v.value,v.maxWeekValue,SUM(v.value) as sumd 
FROM `points` AS p 
INNER JOIN `users` AS u ON u.id = p.userID 
INNER JOIN `values` AS v ON p.valueID = v.valueID 
WHERE p.date_created 
BETWEEN SUBDATE(curdate(), 7) 
AND curdate() 

這正確地計算總和,但沒有條件邏輯將其限制在每週包括maxValue。

在我跳過之前,你可以使用任何一個sql嚮導提供一些幫助,只需用PHP來完成它?先謝謝你!

回答

2

試試這個:

SELECT p.valueID,p.date_created,v.valueName,v.value,v.maxWeekValue, case when SUM(v.value) < v.maxWeekValue then SUM(v.value) else v.maxWeekValue end as sumd 
FROM `points` AS p 
INNER JOIN `users` AS u ON u.id = p.userID 
INNER JOIN `values` AS v ON p.valueID = v.valueID 
WHERE p.date_created 
BETWEEN SUBDATE(curdate(), 7) 
AND curdate() 
+0

這似乎是工作真的很好!謝謝!考慮以下幾點:我有騎自行車,我有游泳項目。這只是返回我的自行車項目的一排。我怎樣才能得到它分組每個活動,並給我一個像這樣回來的行條目? – bradenkeith

+0

您必須將所有要組合的列組合,而不是彙總列。我不太清楚你想要什麼,但嘗試類似的東西。將下面的代碼添加到查詢的最後:GROUP BY p.valueID,p.date_created,v.valueName,v.value,v.maxWeekValue – Rodrigo

+0

正確的你! GROUP BY v.valueID在最後解決了它。非常感謝!! – bradenkeith