[英]Sql get all n:th rows depending on related table value
您好,我正在做一個體育統計網站,它涉及到很多有關sql的挑戰,但是在此之前,我已經能夠解決所有查詢,以獲取所需的統計數據。 但是現在我發現自己在尋求幫助。
我正在使用mysql數據庫。
它具有一個包含所有游戲的游戲表,並且具有一個包含所有游戲事件(例如目標和懲罰)的gameevents表。
現在,我想收集所有的比賽獲勝目標。 這意味着我想讓所有比賽的得分都大於對戰球隊的得分,並且獲得進球意味着我們的球隊領先一個目標。 因此,如果我們的得分是6,而他們的得分(反對的團隊)是2,我想從gameevents表中收集我們的團隊制定的第三個目標(gameevent = 1,thisteam = 1)
table games:
id
ourscore
theirscore
table gameevents:
id
game_id
player_id
eventtype
thisteam
time
下面的查詢將獲取我們團隊在贏得比賽的比賽中做出的所有目標行
select ge.* from gameevents ge
inner join games g
on ge.game_id = g.id
where g.ourscore > g.theirscore
and ge.eventtype = 1
and ge.thisteam = 1
下面的查詢顯示了我現在要執行的操作,但是Limit子句將不包含任何參數。
select ge.* from gameevents ge
where ge.id = (
select ge2.id
from gameevents ge2
inner join games g
on ge2.game_id = g.id
where g.ourscore > g.theirscore
and ge2.eventtype = 1
and ge2.thisteam = 1
order by ge2.time
limit g.theirscore + 1, 1
)
因此,如果我們的球隊以2-1、4-1和6-3贏得了三場比賽,我想獲得第一場第二個進球,第二場第二個進球和第三場第四個進球的排名。
有什么想法讓我前進嗎?
我希望在不聲明變量和東西的情況下解決它,而只是簡單地在老式學校查詢。
編輯:
感覺我很親近。 嘗試使用一些變量使之成為可能,因為我在row_number()中看到了可能的解決方案,但這僅在mssql中。
該鏈接向我指出了這個方向: http : //www.explodybits.com/2011/11/mysql-row-number/
這是我現在的位置:
SELECT subquery.id, game_id, player_id, eventtype, time
FROM
(
SELECT @row_num := IF(@prev_value=ge.game_id,@row_num+1,1) AS RowNumber
,ge.id
,ge.game_id
,ge.player_id
,ge.eventtype
,ge.time
,RowNumber
,@prev_value := ge.game_id
FROM gameevents AS ge
INNER JOIN games AS g
ON ge.game_id = g.id,
(SELECT @row_num := 1) x,
(SELECT @prev_value := '') y
WHERE g.ourscore > g.theirscore
AND ge.eventtype = 1
AND ge.thisteam = 1
ORDER BY ge.game_id, ge.time
) subquery
INNER JOIN games g2
ON g2.id = subquery.game_id
WHERE Rownumber = g2.theirscore + 1
這幾乎可行,當有新的game_id時,計數切換回1,但是在某些游戲上,計數從9開始,然后向下移動至1,而不是從1開始並向上計數。
編輯:
解:
實際上,當我在這里和這里瀏覽我的舊書簽問題時,我想出了一個解決方案(在此鏈接的幫助下: http : //www.artfulsoftware.com/infotree/qrytip.php?id=1098 ) :
SET @gameprev=0, @gameprev2=0;
SELECT goals.player_id FROM (
SELECT game_id, player_id, time, row_number
FROM
(
SELECT player_id, time, @gameprev2 := if(@gameprev = game_id, @gameprev2+1, 1) AS row_number, @gameprev := game_id AS game_id
FROM gameevents
WHERE eventtype = 1
AND thisteam = 1
ORDER BY game_id, time
) as goalorder
) as goals
INNER JOIN games AS g
ON goals.game_id = g.id
WHERE g.ourscore > g.theirscore
AND goals.row_number = g.theirscore +1
似乎MySQL LIMIT不允許動態值。
看這里。
不知道您是否可以在一個查詢中做到這一點,我不知道您為什么要這樣做。 我首先嘗試在一張桌子上加載我想要的序號和相應的游戲ID,例如2 / game 1 /,2 / game 4 /,4 / game 9 /。
然后,我將使用類似於上一頁在此處提到的技術。
因此,我不確定是否可以用一個老式查詢來做到這一點。 您可能需要一個循環,臨時表或類似的東西。 我很想知道如何才能以最簡單的方式准確地做到這一點。
只是給您一些指示,希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.