Sql根据相关的表值获取所有n行

时间:2013-11-30 14:41:37

标签: mysql sql

你好我正在做一个运动统计网站,它提供了很多关于sql的挑战,但在此之前我已经能够解决所有查询获得我想要的收集的统计数据。但是现在我发现自己需要一些帮助。

我正在使用mysql数据库。

它有一个游戏桌,所有游戏都有一个游戏事件表,包含所有游戏事件,如目标和点球。

现在我想收集所有游戏获胜目标。这意味着我希望得到所有比分都高于对手球队得分的比赛,并且得到的目标意味着我们的球队提前一个目标。因此,如果我们的核心是6并且theirscore(对方球队)是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

1 个答案:

答案 0 :(得分:0)

似乎MySQL LIMIT不允许动态值。

见这里。

How to write a SQL query with dynamic LIMIT

不确定您是否可以在一个查询中执行此操作,但我不明白您为什么要这样做。 我会首先尝试在某些表中加载我想要的序数和相应的游戏ID - 比如2 /游戏1 /,2 /游戏4 /,4 /游戏9 /。

然后我会使用一些类似于上面提到的技术。

所以我不确定你是否可以用一个老式的查询来实现它。 您可能需要一个循环或临时表或类似的东西。 我很好奇自己要弄清楚如何以最简单的方式完成它。

只是给你一些指示,希望它有所帮助。