2012-09-13 43 views
1

我正在尋找一種方法來編寫一個查詢來比較多個mysql子查詢的結果,並返回每個查詢中的用戶。Mysql返回匹配用戶的子查詢

我有一個包含幻想足球統計球員。爲了簡化,在這種情況下,我使用了3列:玩家,積分,年份。

我期待在2010年和2011年

運行(基於分)返回的球員誰在排名前50位完成了一個列表的查詢我已經做了與玩弄搜索的手子查詢,在一張桌子上進行連接等,但我仍然對如何解決這個問題感到迷茫。

+1

你應該接受哪個答案最能幫助你。 – Tom

回答

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 
+0

每個子查詢返回前50名玩家,並且你加入玩家(他的名字,ID等)。 – Tom

+0

這將顯示2010年和2011年前50名球員。 – Tom

0

下面是一個例子。我假設您根據積分總和來計算top50,並且每年有多個參賽者。


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 
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 
); 
+0

如果第50人與第51人並列,該怎麼辦? – eggyal

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) 
    
  • 誰在排名前50位中 2010和2011年完成,在這種情況下,您需要進一步的組,結果所有的球員:

    SELECT player 
    FROM  (
          -- query as above 
         ) t 
    GROUP BY player 
    HAVING COUNT(DISTINCT year) = 2 
    
+0

如果確保玩家每年只能出現一次,則可以將'​​COUNT(DISTINCT year)'替換爲更高性能的COUNT(*)'。 – eggyal