Это может показаться сложным, но оно будет агрегировать данные только один раз , затем проходить через них, ранжируя результаты и выбирая только первое
select userid, websiteid, visits
from
(
select
userid, websiteid, visits,
@r := case when @u=userid then @r+1 else 1 end r,
@u := userid
from
(select @u:=null) x,
(select userid, websiteid, count(*) visits
from visit
group by userid, websiteid
order by userid, visits desc) y
) z
where r=1
Внутренний выбор генерирует счетчики для каждой комбинации пользователь-веб-сайт и упорядочивает ее по большинству посещений. Затем он проходит через средний запрос, который ранжирует записи per user
, давая ранг в столбце r
.
Это вариант, который покажет ВСЕ веб-сайты для пользователя, имеющего РАВНЫЙ ранг. Разница с предыдущим запросом состоит в том, что если веб-сайты A и B имеют 10 посещений от пользователя X, в результате будут указаны и A, и B, тогда как предыдущий запрос выбирает один случайным образом для отображения.
select userid, websiteid, visits
from
(
select
userid, websiteid, visits,
@r := case
when @u=userid and @v=visits then @r # same rank
when @u=userid then @r+1 # next rank
else 1 # different user
end r,
@u := userid, @v := visits
from
(select @u:=null, @v:=null) x,
(select userid, websiteid, count(*) visits
from visit
group by userid, websiteid
order by userid, visits desc) y
) z
where r=1
Это тестовая таблица, используемая
create table visit (userid int, websiteid int);
insert into visit select 1,1;
insert into visit select 1,2;
insert into visit select 1,1;
insert into visit select 1,4;
insert into visit select 2,1;
insert into visit select 2,2;
insert into visit select 2,5;
insert into visit select 2,2;