2

私は自分のウェブサイトでコンテストを行っています。すべてのコンテストには複数のエントリが含まれる可能性があります。得票数のMAX値だけ重複がある場合に取得したい。

表は次のとおりです。

contest_id    entry_id    votes
1             1           50
1             2           34
1             3           50
2             4           20
2             5           55
3             6           53

追加情報なしで、コンテスト 1 の MAX 値が重複していることを示すクエリが必要なだけです。

私はこれを試しましたが、うまくいきませんでした:

SELECT MAX(votes) from contest group by contest_id having count(votes) > 1
4

3 に答える 3

5
SELECT  a.contest_ID
FROM    contest a
        INNER JOIN
        (
          SELECT contest_id, MAX(votes) totalVotes
          FROM contest
          GROUP BY contest_id
        ) b ON a.contest_ID = b.contest_ID AND
               a.votes = b.totalvotes
GROUP BY a.contest_ID
HAVING COUNT(*) >= 2
于 2013-01-10T07:24:27.347 に答える
5

これにより、コンテストごとの最大投票値が検出され、その投票数のエントリがカウントされます。次に、複数のヒットがあるコンテストを表示します。

SELECT contest_id
FROM contests
WHERE votes=(
  SELECT MAX(votes) FROM contests c WHERE c.contest_id=contests.contest_id
)
GROUP BY contest_id
HAVING COUNT(*) > 1;

テスト用の SQLfiddle

于 2013-01-10T07:22:57.143 に答える
0

最初にサブクエリで各コンテスト ID の最大投票数を選択し、次に結果に対して結合することでそれを行うことができます ( demo on SQLFiddle ):

SELECT contest_id, votes
FROM contest
  JOIN (
    SELECT contest_id, MAX(votes) AS votes
    FROM contest GROUP BY contest_id
  ) AS foo USING (contest_id, votes)
GROUP BY contest_id
HAVING COUNT(*) > 1

このようにすることの良い点は、それが独立したサブクエリであるため、MySQL はそれを 1 回だけ摩擦する必要があることです。

Ps。はい、これは基本的にJWの回答と同じですが、結合に使用したわずかに異なる構文を示すために、とにかくそのままにしておくことにしました。

于 2013-01-10T07:33:24.450 に答える