2013-05-08 2 views
7

Пожалуйста, дайте мне знать, что случилось с командой нижеКак найти максимальное количество с помощью mysql?

mysql> select max(count(*)) from emp1 group by name; 
ERROR 1111 (HY000): Invalid use of group function 
+0

Я полагаю, что в таблице есть несколько строк, в которых «имя» имеет одинаковое значение. Он хочет найти «имя» с наибольшим количеством строк. –

+0

Вы пытаетесь считать «имя», а затем возвращать только самый высокий счет? – SOfanatic

+0

Вы не можете агрегировать совокупность в пределах той же области – Strawberry

ответ

7

Try:

SELECT NAME, COUNT(*) as c FROM table GROUP BY name ORDER BY c DESC LIMIT 1

1

я на следующее (предполагая, что я правильно понимаю, что вы хотите):

select c from 
(
    select count(*) as c, name from emp1 group by name 
) tmp 
order by c desc limit 1 

Это выбирает наибольшее количество из всех значений по имени. Например, если таблица содержит

Name 
----------------------- 
Test 
Test 
Hello 
World 
World 
World 

Внутренний выбор будет создать «стол» с этими данными

c   Name 
---------------------- 
2   Test 
1   Hello 
3   World 

Внешний выбор прикажет это, c нисходящих и выберите первую запись, которая 3.

Это может быть сокращен до

select count(*) c from emp1 group by name order by c desc limit 1 
+0

Очевидно, что внешний запрос здесь не требуется. ORDER BY COUNT (*) DESC LIMIT 1 будет делать то же самое – Strawberry

0

Вы должны выбрать name группировать ею, а затем использовать max() на результат, что в качестве подзапроса:

select max(count) 
from (
    select 
    name, 
    count(*) as count 
    from emp1 
    group by name) x 

Я отформатированный запрос таким образом, вы можете видеть, что происходит, вместо того, чтобы помещать все это на одной линии, когда вы это показывали. Btw «x» в нем fnf является обязательным псевдонимом для подзапроса.

0

Просто введите имя в свой оператор select, чтобы использовать группу.

Читайте о Группировать функции здесь ... enter link description here

0
SELECT MAX(name_count) 
FROM 
     (
     SELECT name 
       ,count(*) as name_count 
     FROM emp1 
     GROUP BY 
       name 
     ) 
+0

Есть ли способ также выбрать имя в самой внешней инструкции SELECT? Итак, если вы хотите узнать, какая группа имен была с MAX (name_count)? – Logan

1

Вы спрашиваете «что случилось с вашим утверждением». Это ваше заявление:

select max(count(*)) 
from emp1 
group by name; 

Я понимаю, что вы имеете в виду. Но SQL-компилятор этого не делает. Причина проста. Заданный select может иметь только один пункт group by. И ваш запрос просит двух из них. Первое - это имя group by. Во-вторых, это совокупность всех этих результатов.

Правильный способ написать запрос (как вы, кажется, намерены) использует подзапрос:

select max(cnt) 
from (select count(*) as cnt 
     from emp1 
     group by name 
    ) t 

Это вполне разумное решение, которое использует только стандартный SQL. Другие ответы предложили решение, используя предложение limit, которое может быть немного более эффективным.

-2
***Example: 1*** 
SELECT * 
FROM customer 
WHERE customer.ID IN 
     (SELECT customer_id 
     FROM (SELECT customer_id, MAX(cust_count) 
       FROM (SELECT customer_id, 
           COUNT(customer_id) 
           AS cust_count 
         FROM `order` 
         GROUP BY customer_id) AS cust_count_tbl) AS cust_tbl); 


***Example -2*** 

SELECT * 
     FROM customer 
    LEFT JOIN 
     (SELECT customer_id, COUNT(customer_id) AS cc 
     FROM `order` 
     GROUP BY customer_id 
     ORDER BY cc DESC 
     LIMIT 1) AS kk 
    ON customer.ID = kk.customer_id 
    WHERE kk.customer_id = customer.ID; 
4

Из прилагаемого кода Я понимаю, что вы хотите выбрать максимальное число сотрудников, имеющих одно и то же имя.

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

Попробуйте это:

SELECT MAX(Total) FROM (SELECT COUNT(*) AS Total FROM emp1 GROUP BY name) AS Results 

... или это:

SELECT COUNT(name) FROM emp1 GROUP BY name ORDER BY COUNT(name) DESC LIMIT 1 

Оба запроса возвращают одинаковый результат, но их реализации различны.

Используйте тот, который вам больше всего подходит, или в зависимости от того, что вы предпочитаете.

+1

Если мы не особенно педантичны, я думаю, что это дает ответ - хотя порядок по лимиту будет более обычным – Strawberry

Смежные вопросы