我正在尋找一種方法來編寫一個查詢來比較多個mysql子查詢的結果,並返回每個查詢中的用戶。Mysql返回匹配用戶的子查詢
我有一個包含幻想足球統計球員。爲了簡化,在這種情況下,我使用了3列:玩家,積分,年份。
我期待在2010年和2011年
運行(基於分)返回的球員誰在排名前50位完成了一個列表的查詢我已經做了與玩弄搜索的手子查詢,在一張桌子上進行連接等,但我仍然對如何解決這個問題感到迷茫。
我正在尋找一種方法來編寫一個查詢來比較多個mysql子查詢的結果,並返回每個查詢中的用戶。Mysql返回匹配用戶的子查詢
我有一個包含幻想足球統計球員。爲了簡化,在這種情況下,我使用了3列:玩家,積分,年份。
我期待在2010年和2011年
運行(基於分)返回的球員誰在排名前50位完成了一個列表的查詢我已經做了與玩弄搜索的手子查詢,在一張桌子上進行連接等,但我仍然對如何解決這個問題感到迷茫。
下面是一個例子。我假設您根據積分總和來計算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
可以使用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
);
如果第50人與第51人並列,該怎麼辦? – eggyal
這是有些不明確您是否希望:
所有在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
如果確保玩家每年只能出現一次,則可以將'COUNT(DISTINCT year)'替換爲更高性能的COUNT(*)'。 – eggyal
你應該接受哪個答案最能幫助你。 – Tom