簡體   English   中英

SQL根據相關表值獲取所有n:th行

[英]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不允許動態值。

看這里。

如何使用動態LIMIT編寫SQL查詢

不知道您是否可以在一個查詢中做到這一點,我不知道您為什么要這樣做。 我首先嘗試在一張桌子上加載我想要的序號和相應的游戲ID,例如2 / game 1 /,2 / game 4 /,4 / game 9 /。

然后,我將使用類似於上一頁在此處提到的技術。

因此,我不確定是否可以用一個老式查詢來做到這一點。 您可能需要一個循環,臨時表或類似的東西。 我很想知道如何才能以最簡單的方式准確地做到這一點。

只是給您一些指示,希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM