2013-05-08 6 views
7

私がしようと、以下のコマンドを使用して、何が間違っているmysqlを使用して最大数を見つける方法は?

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

テーブルに 'name'が同じ値を持つ行がいくつかあるとします。彼は最大数の行を持つ 'name'を見つけたいと思っています。 –

+0

あなたは 'name'を数えようとしていますか? – SOfanatic

+0

同じスコープ内で集約を集計することはできません。 – Strawberry

答えて

7

を教えてください:

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下降することによって、これを注文すると、最初のエントリを選択することになり、このデータ

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

で「表」を作成します3

これは、あなたがサブクエリとしてその結果にmax()を使用し、その後、それによってグループにnameを選択する必要があります

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

外側のクエリはここでは必要ありません。 ORDER BY COUNT(*)DESC LIMIT 1も同様です。 – Strawberry

0

に短縮することができます。

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

私は、クエリをフォーマットしましたあなたは、あなたがそれを見たときに、すべてを1行に入れるのではなく、何が起こっているかを見ることができます。 fnfで "x"を指定すると、サブクエリの必須エイリアスになります。

0

group byを使用するには、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には1つの句しか含めることができません。そしてあなたの質問はそれらの2つを求めています。最初はgroup byの名前です。 2番目は、すべての結果の集計です。

(あなたが意図しているように見えるよう)あなたのクエリを記述する適切な方法は、サブクエリを使用している:

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

提供されたコードから、同名の従業員のうち最も高い人数を選択したいと考えています。

クエリの問題は、複数のレベルの集計を1つのスコープに適用しようとしていることです。

はこれを試してみてください:

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

関連する問題