繁体   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