你好我正在做一个运动统计网站,它提供了很多关于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
答案 0 :(得分:0)
似乎MySQL LIMIT不允许动态值。
见这里。
How to write a SQL query with dynamic LIMIT
不确定您是否可以在一个查询中执行此操作,但我不明白您为什么要这样做。 我会首先尝试在某些表中加载我想要的序数和相应的游戏ID - 比如2 /游戏1 /,2 /游戏4 /,4 /游戏9 /。
然后我会使用一些类似于上面提到的技术。
所以我不确定你是否可以用一个老式的查询来实现它。 您可能需要一个循环或临时表或类似的东西。 我很好奇自己要弄清楚如何以最简单的方式完成它。
只是给你一些指示,希望它有所帮助。