Как мы получаем несколько столбцов (TOP), используя один запрос MySQL?

У меня есть структура таблицы, например:

id  | ex_name | att_name 
10  | David   | sam G&G   
12  | John    | mark hol     
13  | John    | john b      
14  | Mark    | john c    
15  | David   | mark hol   
16  | David   | mark hol      
17  | Mark    | sam G&G     
18  | John    | john b      
19  | David   | sam G&G      
20  | John    | sam G&G

Когда я использую следующий запрос:

SELECT att_name
     , count(att_name) as att_count 
  FROM `tablename` 
 group 
    by att_name 
 order 
    by att_count desc

Возвращает:

sam G&G = 4
mark hol = 3
john b = 2
john c = 1

Мне нужны максимальные значения вывода, т.е. Сэм G&G, которому 4 года

То же самое со столбцом ex_name, которое он возвращает:

David = 4
john = 4
mark = 2

Я хочу, чтобы верхние значения столбца ex_name, которые являются Дэвидом и Джоном, имели счет 4

Что я хочу получить в конечном итоге:

ex_name | att_name | ex_count | att_count
David     Sam G&G     4          4
John                  4

Я также попытался выполнить запрос ниже для получения вывода, но в этом случае я получаю ex_name, а att_name имеет значение NULL.

SELECT a.att_name,b.att_name,max(a.ex_count),max(b.att_count)
FROM application_data
INNER JOIN (
    SELECT ex_name,count(ex_name) as ex_count
    FROM application_data
    GROUP BY ex_name
) a 
INNER JOIN (
    SELECT att_name ,count(att_name) as att_count
    FROM application_data
    GROUP BY att_count
) b

Он возвращает:

ex_name | att_name | ex_count | att_count
NULL      NULL        4           4

Вы можете мне помочь? Заранее спасибо

Вы также можете сообщить нам, какую версию MySQL вы используете, например, если вы используете MySQL 8+, могут быть некоторые новые методы решения вашей проблемы.

Tim Biegeleisen 07.02.2019 15:00

Запрос предполагает, что в данных есть att_count, в данных примера его нет. Предполагая, что вы забыли разместить данные здесь, запрос не должен даже выполняться, потому что это не ANSI SQL, вы не можете смешивать неагрегированные столбцы ) со столбцом (столбцами) агрегирования в предложении SELECT без использования GROUP BY, см. демо

Raymond Nijland 07.02.2019 15:07

@RaymondNijland, во втором запросе я упомянул count(att_name) как att_count.

vikash 07.02.2019 15:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы хотите агрегировать таблицу по некоторому столбцу, а затем сохранить все групповые записи, которые имеют наибольшее количество. Один из способов сделать это — добавить в текущий запрос предложение HAVING, в котором утверждается, что количество сохраняемых групп — это наибольшее количество из всех групп.

SELECT att_name, COUNT(*) AS cnt
FROM tablename
GROUP BY att_name
HAVING COUNT(*) = (SELECT COUNT(*) FROM tablename
                   GROUP BY att_name ORDER BY COUNT(*) DESC LIMIT 1);

Демо

Другие вопросы по теме