В статистике это называется режим .Один из относительно простых способов сделать это в MySQL - использовать два уровня агрегирования:
select bookname,
substring_index(group_concat(bookauthor order by cnt desc), ',', 1) as mode_author
from (select bookname, bookauthor, count(*) as cnt
from t
group by bookname, bookauthor
) b
group by bookname;
В этом есть некоторые нюансы.Если авторы могут иметь запятые в своем имени, тогда необходим другой разделитель.Кроме того, если список авторов превышает максимальную длину по умолчанию для group_concat()
, то это необходимо расширить.
MySQL 8+, конечно, упрощает это, поддерживая оконные функции:
select bookname, bookauthor
from (select bookname, bookauthor, count(*) as cnt,
row_number() over (partition by bookname order by count(*) desc) as seqnum
from t
group by bookname, bookauthor
) b
where seqnum = 1;
Вы не говорите, что делать в случае галстуков.Это возвращает одного произвольного лучшего автора.Но изменение row_number()
на rank()
возвращает их все.