2011-07-10 6 views
1

私はテーブルを持っています(かなり大きなもの)。カラムはたくさんあり、そのうち2つは "post"と "user"です。 特定の「投稿」について、どの「ユーザー」が最も投稿されたのかを知りたい。テーブル内の特定の値の最大発生数

私は最初にすべてのエントリを取得しようと思っていました(post = 'wanted_post')。その後、PHPのハックを投げて、どの "user"値が最も得られるかを調べました。 MySQLの微妙な呼び出しの知識が不足しているので、私はこの値を得るための純粋なMySQLの方法を探しています(基本的に、特定の "投稿"に最も多く投稿された "ユーザー" ID)。

可能ですか?あるいは、私はハイブリッドSQL-PHPソリューションに落ちるべきですか?

おかげで、 Cystack

答えて

5

これはあなたが望むものであるようですね...私は何かが足りないのですか?

SELECT user 
FROM myTable 
WHERE post='wanted_post' 
GROUP BY user 
ORDER BY COUNT(*) DESC 
LIMIT 1; 

EDIT:このクエリが何をするかの説明:

がうまくいけば、最初の3行は、SQLに精通している人には意味をなさない。それは楽しいことをする最後の3行です。

  1. GROUP BY user - これはuser列の同じ値を持つ行を崩壊。これは、クエリの最後の行だった場合、私たちが期待するかもしれない。このような出力なもの:

    +-------+ 
    | user | 
    +-------+ 
    | bob | 
    | alice | 
    | joe | 
    
  2. ORDER BY COUNT(*) DESCからCOUNT(*)は前GROUP BY句と一緒に働くの集計関数、です。各ユーザーのGROUP BYによって「折りたたまれた」行がすべて集計されます。わずかに変更された文でやっているかを理解しやすいかもしれないが、それは潜在的な出力です:

    SELECT user,COUNT(*) 
    FROM myTable 
    WHERE post='wanted_post' 
    GROUP BY user; 
    
    +-------+-------+ 
    | user | count | 
    +-------+-------+ 
    | bob |  3 | 
    | alice |  1 | 
    | joe |  8 | 
    

    これは、ユーザーごとの投稿数を示しています。

    しかし、実際に集計関数の値を出力することは厳密には必要ではありません。順序付けに使用し、実際にデータを出力することはできません。 (もちろん、あなたのトップポスターが投稿した投稿の数を知りたければ、それもあなたの出力に含めたいと思うかもしれません。)

    キーワードDESCは、データベースに降順にソートするのではなく、デフォルトは昇順です。

    当然のことながら、ソートされた出力は(私たちはSELECTリストにCOUNT(*)を残すと仮定して)次のようになります。

    +-------+-------+ 
    | user | count | 
    +-------+-------+ 
    | joe |  8 | 
    | bob |  3 | 
    | alice |  1 | 
    
  3. LIMIT 1 - それだけでどのように制限し、これは、おそらく理解するのが最も簡単です多くの行が返されます。私たちは、ほとんどの投稿から少数の投稿までリストを並べ替えるので、トップのポスターだけが必要なので、最初の結果が必要です。トップ3のポスターが必要な場合は、代わりにLIMIT 3を使用します。

+0

そうです。どうやらMySQLは思ったよりも強力です。もう一度ありがとう – Cystack

+0

うわー、私は非常に頻繁に "強力な" MySQLを呼び出す人々を聞いていない:) – Flimzy

+0

しかし、構文がわかりません。 「ORDER BY」行がなければ、私は「ポスト」にリンクされているすべての「ユーザー」を手に入れることになりました。どのようにORDER BYを追加すると、COUNT(*)は各グループに個別に適用され、whoelリクエストには適用されません(したがって、別個の「ユーザー」の番号が返されます)。 – Cystack

関連する問題