Oleksandr IY
Oleksandr IY

Reputation: 3116

filter results by max count(field)

here is query

SELECT `mpv`.`member_id` as member_id, `screen_name`, `viewed_url`, 
    count(viewed_url) as viewed_url_cnt
FROM (`tracker` mpv)
JOIN `members` m ON `mpv`.`member_id`=`m`.`member_id`
GROUP BY `viewed_url`, `member_id`

it returns

+-----------+-------------+------------+----------------+
| member_id | screen_name | viewed_url | viewed_url_cnt |
+-----------+-------------+------------+----------------+
|         1 | admin       | /          |              1 |
|         1 | admin       | /1         |              1 |
|         1 | admin       | /2         |              1 |
|         1 | admin       | 2          |              1 |
|         1 | admin       | 3          |              2 |
|         2 | test        | 4          |              1 |
+-----------+-------------+------------+----------------+
6 rows in set (0.12 sec)

I need to get all records which have highest viewed_url_cnt grouped by viewed_url, member_id. So based on results on the top, I whould like to get

+-----------+-------------+------------+----------------+
| member_id | screen_name | viewed_url | viewed_url_cnt |
+-----------+-------------+------------+----------------+
|         1 | admin       | 3          |              2 |
|         2 | test        | 4          |              1 |
+-----------+-------------+------------+----------------+
6 rows in set (0.12 sec)

Thanks

Upvotes: 0

Views: 128

Answers (3)

Mosty Mostacho
Mosty Mostacho

Reputation: 43434

Try this:

select s1.member_id, s1.screen_name, s1.viewed_url, s1.viewed_url_cnt from (
  select t1.member_id, t1.screen_name, t1.viewed_url, count(*) viewed_url_cnt
  from tracker t1
  group by t1.member_id, t1.screen_name, t1.viewed_url
) as s1
join (
  select s2.member_id, max(viewed_url_cnt) as viewed_url_max from (
    select t1.member_id, count(*) viewed_url_cnt
    from tracker t1
    group by t1.member_id, t1.viewed_url
  ) as s2
  group by s2.member_id
) as s3
on s1.member_id = s3.member_id and s1.viewed_url_cnt = s3.viewed_url_max

Upvotes: 1

xdevel
xdevel

Reputation: 204

I guess the following is possible :

SELECT * FROM (SELECT * FROM table GROUP BY name) as foo GROUP BY dept

replace the inner query with your query and then you can just get the max(viewed_url_cnt) group by member_id .
Let me know if this fails..

Upvotes: 1

VeeArr
VeeArr

Reputation: 6178

I may be misinterpreting what you want, but a solution would be to use an inner query to determine the appropriate viewed_url_cnt for each member_id, and then JOIN that to your table:

SELECT *
FROM my_qry outer
JOIN
(SELECT member_id, MAX(viewed_url_cnt) AS max_cnt
FROM my_qry
GROUP BY member_id) inner 
ON outer.member_id = inner.member_id AND outer.viewed_url_cnt = inner.max_cnt

(Here my_qry is the query you used to generate the original table.)

Upvotes: 1

Related Questions