sql >> データベース >  >> RDS >> Mysql

結合テーブルを使用したMySQLGreatestNの結果

    私はそれを解決すると思います:)

    最初に、あなたが始めた方法に基づいた1つの解決策があります。しかし、person_idごとに正確な3行(または、たとえば3つを選択した場合)を表示するために解決できなかった問題があります。問題は、解決策が、現在の行よりも大きいrating_averageで行がいくつあるかをカウントすることに基づいていることです。したがって、同じ上位値が5つある場合は、5つすべてを表示するか、まったく表示しないかを選択できますが、それは良くありません。これがその方法です...(もちろん、これは4つの上位値がある場合、それらすべてを表示する例です(データを表示しないことはまったく意味がないと思います))...

    >
     SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average
     FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
                  m.rating_average AS rating_average
           FROM person p
           INNER JOIN credit c ON c.person_id = p.id
           INNER JOIN media m ON m.id = c.media_id) as t1
     WHERE (SELECT COUNT(*) 
           FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
                        m.rating_average AS rating_average
                 FROM person p
                 INNER JOIN credit c ON c.person_id = p.id
                 INNER JOIN media m ON m.id = c.media_id) AS t2
           WHERE t2.person_id = t1.person_id AND t2.rating_average > t1.rating_average) < 3
     ORDER BY person_id ASC, rating_average DESC
    

    重要: このソリューションは、自分で繰り返す値がない場合に機能します(各人に正確に3行を表示します)...これがフィドル http://sqlfiddle.com/#!9/eb0fd/64 person_idが1の場合の問題を確認できます!

    その後、私はもう少し遊んで、あなたが思う質問であなたが望むようにそれを機能させるようにしました。そのためのコードは次のとおりです。

    SET @num := 0, @person := 0;
    
    SELECT person_id, credit_id, media_id, rating_average, rowNumber 
    FROM (SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average,
                 @num := if(@person = t1.person_id, @num + 1, 1) AS rowNumber,
                 @person := t1.person_id
          FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
                       m.rating_average AS rating_average
                FROM person p
                INNER JOIN credit c ON c.person_id = p.id
                INNER JOIN media m ON m.id = c.media_id
                ORDER BY p.id ASC, m.rating_average DESC) as t1) as t2
     WHERE rowNumber <= 3
    

    これがそのhttp://sqlfiddle.com/#!9/eb0fd/65のフィドルです。 ...

    GL!

    P. S.英語で申し訳ありませんが、私が話していることを理解していただければ幸いです...




    1. ClusterControl:新しいクエリモニターの概要

    2. 文字列を16進数に、またはその逆に変換するにはどうすればよいですか?

    3. MySQLで主キーのインデックスが自動的に作成されますか?

    4. 列の一意の値ごとに最初の行のみを選択するにはどうすればよいですか?