Marc
Marc

Reputation: 163

MySQL - Get the max count from a subquery group

I have a table logins with the following schema:

| id | user_id | weekday |
|----|---------|---------|
|  1 |       1 |       1 |
|  2 |       1 |       2 |
|  3 |       1 |       2 |

...

Weekday is a number from 0 to 6.

I want to get which weekday has the highest count, for each user_id in the table.

I tried the following query:

SELECT MAX(num) as max_num, user_id, weekday
FROM (
    SELECT COUNT(*) as num, user_id, weekday
    FROM logins
    GROUP BY user_id, weekday
) C
WHERE user_id = C.user_id AND num = C.num
GROUP BY user_id;

Which gets me weekday = 1 instead of 2. I think that I shouldn't use a WHERE clause here, but I couldn't manage to get the correct result.

I've checked other similar questions with no luck, such as:

I created a SQL Fiddle with my example: http://sqlfiddle.com/#!9/e43a71/1

Upvotes: 1

Views: 1314

Answers (2)

Taras Bogach
Taras Bogach

Reputation: 21

SELECT days.user_id, days.weekday, days.num
FROM (
    SELECT user_id, MAX(num) AS num
    FROM (
      SELECT user_id, weekday, COUNT(*) AS num
      FROM logins
      GROUP BY user_id, weekday
    ) max
    GROUP BY user_id
) nums
JOIN (
    SELECT user_id, weekday, COUNT(*) as num
    FROM logins
    GROUP BY user_id, weekday
) days ON(days.user_id = nums.user_id AND days.num = nums.num);

-- With Mariadb 10.2 or MySQL 8.0.2
WITH days AS (
    SELECT user_id, weekday, COUNT(*) as num
    FROM logins
    GROUP BY user_id, weekday
)
SELECT days.user_id, days.weekday, days.num
FROM (
    SELECT user_id, MAX(num) AS num
    FROM days
    GROUP BY user_id
) nums
JOIN days ON(days.user_id = nums.user_id AND days.num = nums.num);

Upvotes: 0

Gordon Linoff
Gordon Linoff

Reputation: 1269693

Here is a method:

SELECT user_id, MAX(num) as max_num, 
       SUBSTRING_INDEX(GROUP_CONCAT(weekday ORDER BY num DESC), ',', 1) as weekday_max
FROM (SELECT user_id, weekday, COUNT(*) as num
      FROM logins l
      GROUP BY user_id, weekday
     ) uw
GROUP BY user_id;

Upvotes: 1

Related Questions