[SOLVED] How to select a query from mysql database based on a certain condition

Issue

I want to answer the following question using the below Mysql tables.

  1. How many days were the user active on avg. (had an action) in the last
    week?

  2. I want to Display user Avg by day,
    where
    ((user action is not 0)/unique day) in the last 7 days.

0 means the user is not active and 1 means active.

I am still a newbie in SQL and here is what I have tried so far. I am not really sure of my answers.

SELECT u.username, COUNT(u.snapshot_date) as 'active_days', a.action
FROM actions a
JOIN  users u
    ON a.user_id = u.user_id
WHERE  NOT (a.action = 0)
GROUP BY u.username;

my output

username active_days action
Albert        2        1
Paul          4        1
Ronaldo       2        1
Messi         1        1

users table

user_id username    snapshot_date
    1   Albert       2022-01-10
    2   Paul         2022-01-10
    3   Blessing     2022-01-10
    4   Ronaldo      2022-01-22
    5   Messi        2022-01-01
        

action table

action_id action snapshot_date user_id

1            0    2022-01-10    1
2            1    2022-01-10    2
3            0    2022-01-10    3
4            1    2022-01-22    4
5            1    2022-01-01    5
6            0    2022-01-10    2
7            0    2022-01-10    1
8            0    2022-01-10    3
9            0    2022-01-22    2
10           0    2022-01-01    4
11           0    2022-01-10    2
12           1    2022-01-10    1
13           0    2022-01-10    3
14           1    2022-01-22    2
15           1    2022-01-01    4
16           1    2022-01-10    2
17           1    2022-01-10    2
18           0    2022-01-10    1
19           1    2022-01-22    1
20           0    2022-01-01    5
            

Solution

Average of last week

Since there are 7 days, you can divide the count by 7

SELECT u.username, COUNT(u.snapshot_date) / 7 as active_days, 1 as action
FROM actions a
JOIN  users u
    ON a.user_id = u.user_id
WHERE  NOT (a.action = 0)
GROUP BY u.username, u.snapshot_date;

For the second problem you can average the sum of action:

SELECT u.username, SUM(a.action) / 7 as action_days, 1 as action
FROM actions a
JOIN  users u
    ON a.user_id = u.user_id
WHERE  NOT (a.action = 0)
GROUP BY u.username, u.snapshot_date;

Answered By – Lajos Arpad

Answer Checked By – Marilyn (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published.