I have this user table:
id(int) | created (datetime)
I'm showing statistics on a server which does following: - You choose a date - You choose if you want to show daily, weekly or monthly statistics (see query)
I have made the query very static by just doing it like this:
WEEK(DATE_ADD(" + date + ", INTERVAL -2 WEEK) // Shows how many users that has been created from two weeks before current date to current date
Now i want the admin that should look at the statistic to be able to choose how far back in time he wants to show statistics from. So i need to make the query dynamic.
Here is the original static query i have made:
String sQuery = "SELECT " +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created) as totalNumberOfCreatedUsers, " +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(" + date + ") = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysNumberOfCreatedUsers, " +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -1 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusOneNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -2 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusTwoNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -3 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusThreeNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -4 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFourNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -5 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFiveNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -6 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusSixNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -7 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusSevenNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(" + date + ") = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -1 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusOneNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -2 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusTwoNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -3 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusThreeNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -4 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusFourNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(" + date + ") = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -1 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusOneNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -2 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusTwoNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -3 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusThreeNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -4 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusFourNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -5 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusFiveNumberOfCreatedUsers," +
" (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -6 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusSixNumberOfCreatedUsers" +
"";
eg: One solution i could do (java): (But this would create a large query, and i want a more efficient way to do it) (btw, this example is not working code, just something i thought of to give you and idea of what a solution could be)
The admin chooses to see 20 days/weeks/months
String addToQuery = "";
int daysWeeksMonthsToLookBack = inputFromUser // inputFromUser = 20 in this example
for(int i=0; i<daysWeeksMonthsToLookBack; i++){
addToQuery += " (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -" + i + " DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFiveNumberOfCreatedUsers," +
}
Anyone got a suggestion how i can do this more efficiently? Thanks in advance
I would have used a range like
SELECT count(s.id)
FROM statistic_customer_created s
WHERE s.created >= {date calculated in Java}
By taking the difference of these dates you can get all those created between 1 and 2 days ago.
The count for those created in the last 7 days and those created in the last week should be the same.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.