1

複数の mysql サブクエリの結果を比較し、各クエリに含まれるユーザーを返す 1 つのクエリを作成する方法を探しています。

プレイヤーのファンタジー フットボールの統計を含む があります。簡単にするために、この場合、私が使用している 3 つの列があります: プレーヤー、ポイント、年です。

2010 年と 2011 年の両方で (ポイントに基づいて) トップ 50 に入ったプレーヤーのリストを返すクエリを実行しようとしています。

サブクエリで遊んだり、1つのテーブルで結合を行ったりするなど、多くの検索を行ってきましたが、これにアプローチする方法についてはまだ途方に暮れています。

4

4 に答える 4

0

を使用できますUNION ALL。これによりTop 50、両方の年が取得され、同じ結果セットに入れられます。参加する必要はありません。

(
    select player, year, points 
    from players
    where year = 2010
    order by points desc
    limit 50
)
union all
(
    select player, year, points 
    from players
    where year = 2011
    order by points desc
    limit 50
);
于 2012-09-13T16:40:32.897 に答える
0

次のようなことができます。

SELECT  a.player

FROM    (SELECT player FROM players WHERE Year = 2010 ORDER BY points DESC LIMIT 50) a

        JOIN

        (SELECT player FROM players WHERE Year = 2011 ORDER BY points DESC LIMIT 50) b
        ON a.player = b.player
于 2012-09-13T16:08:05.013 に答える
0

ここに例があります。ポイントの合計に基づいてトップ 50 を計算し、毎年各プレーヤーに複数のエントリがあると仮定しました。


select y2010.player 
from (
  select player, sum from (
    select st1.player player, sum(st1.points) sum from stats st1 where st1.year = 2010 group by st1.player order by sum desc
  ) t1 limit 50 offset 0
) y2010, (
  select player, sum from (
    select st1.player player, sum(st1.points) sum from stats st1 where st1.year = 2011 group by st1.player order by sum desc
  ) t1 limit 50 offset 0
) y2011
where y2010.player = y2011.player
于 2012-09-13T16:36:15.663 に答える
0

あなたが望むかどうかは少しあいまいです:

  • 2010 年にトップ 50 に入ったすべてのプレーヤーと、2011 年にトップ 50 に入ったすべてのプレーヤー:

    SELECT *
    FROM   scores
    WHERE  year = 2010
       AND points >= (SELECT MIN(points) FROM (
                       SELECT   points
                       FROM     scores
                       WHERE    year = 2010
                       ORDER BY points DESC
                       LIMIT    50
                     ) t)
    UNION ALL
    SELECT *
    FROM   scores
    WHERE  year = 2011
       AND points >= (SELECT MIN(points) FROM (
                       SELECT   points
                       FROM     scores
                       WHERE    year = 2011
                       ORDER BY points DESC
                       LIMIT    50
                     ) t)
    
  • 2010 年と 2011 年の両方で上位 50 位に入ったすべてのプレーヤー。この場合、結果をさらにグループ化する必要があります。

    SELECT   player
    FROM     (
               -- query as above
             ) t
    GROUP BY player
    HAVING   COUNT(DISTINCT year) = 2
    
于 2012-09-13T16:57:18.950 に答える