2015-01-02 12 views
7

私はこの問題のタイトルを付ける方法がわかりません。あなたが良い言葉を持っているなら、私を訂正してください。MySQLは同じ条件値を持​​つ最上行を選択します

私は2つのテーブル、ユーザーと投稿を持っています。

ユーザー:

id | username | password | ... 

投稿: - ほとんどの記事を書かれているユーザー

id | author_id | title | content | ... 

は今、私が "最もアクティブ" ユーザーをリストします。具体的には、top 10の結果が必要です。

SELECT u.username, COUNT(p.id) AS count 
FROM Posts p, Users u 
WHERE u.id=p.author_id 
GROUP BY p.author_id 
ORDER BY count DESC 
LIMIT 10; 

私は期待される結果を得ることができます。ただし、ユーザーの数が同じ場合、ランキングは「fair」にならないことがあります。ここで

User 1 | 14 
User 2 | 13 
... 
User 9 | 4 
User 10 | 4 

4投稿があり、実際にいくつかのより多くのユーザーがあります。

例えば、私のような結果が得ることができます。

したがって、top 10は正確に10の結果ではない可能性があります。 4の投稿を持っている余分な行が含まれている "fair"の結果を得るにはどうすればよいですか?

+1

非常に興味深い問題:)クエリで変数が必要になる場合があります。人々がどのように思い付くのかを見てみましょう。 –

+0

いくつかのサンプルデータを追加して素晴らしいフィドルを見ることができますか? –

+0

@Hanky laugh Panky私はここでデータを簡略化しました。あなたがテストしたい場合、あなたは簡単にいくつかのデータを偽造することができる "トップ2"のケースを試すことができます。 – mrmoment

答えて

4

を、私は思う:あなたが投稿が自分の中で10位を持っているどのくらい知っているサブクエリが必要トップ10。次に、外側のクエリを使用して、ほぼそのポストカウントでユーザーを抽出します。

SELECT u.username, COUNT(p.id) AS count 
FROM Posts p 
JOIN Users u ON u.id = p.author_id 
GROUP BY p.author_id 
HAVING COUNT(p.id) >= 
(
    SELECT COUNT(p.id) AS count 
    FROM Posts p 
    JOIN Users u ON u.id = p.author_id 
    GROUP BY p.author_id 
    ORDER BY count DESC 
    LIMIT 9, 1 
) 
ORDER BY count DESC 
+2

'LIMIT 1,9'? –

+0

私はそれが 'LIMIT 9,1 'であるべきだと思います。 – Barmar

+0

申し訳ありませんが、私の悪い!編集済み – Jean

0

すると、このお試しください:これは適切なソリューションである

SELECT username, PostCount 
FROM (SELECT username, PostCount, IF(@PostCount = @PostCount:=PostCount, @idx:[email protected]+1, @Idx:=1) AS idx 
     FROM (SELECT u.username, COUNT(p.id) AS PostCount 
      FROM Posts p 
      INNER JOIN Users u ON u.id=p.author_id 
      GROUP BY p.author_id 
      ) AS A, (SELECT @PostCount:=0, @Idx:=1) AS B 
     ORDER BY PostCount DESC 
    ) AS A 
WHERE idx <= 10; 
+0

3レベルクエリですか?何かが間違っています... – Jean

+1

あなたは投稿者を抽出するために各著者のためにサブクエリを作成し、あなたはポストカウントでユーザーをグループ化しようとします、そして、ちょっとナンセンスだと思います。 – Jean

3

そうでないかもしれない最善の解決策

select u.username, COUNT(p.id) AS count 
FROM Posts p 
join Users u on u.id = p.author_id 
GROUP BY p.author_id 
having COUNT(p.id) in 
(
    SELECT COUNT(p.id) 
    FROM Posts p 
    join Users u on u.id = p.author_id 
    GROUP BY p.author_id 
    ORDER BY count DESC 
    LIMIT 10  
) 
ORDER BY count DESC 
+3

'HAVING COUNT .id)IN'? '> ='を使用すると、サブクエリは単一の値を返す必要があります。 'LIMIT 9、1'を使うようにサブクエリを変更することができます。 – Barmar

+1

あなたは 'DISTINCT'を使うべきではありません。 – Barmar

+0

私は私の答えで@Barmarの提案を実装しました、私は正しいと思います – Jean

関連する問題