2009-08-06 44 views
0

问:我该如何制作MySQL?最近几天选择在以内玩过所有玩过游戏的用户?>?x游戏数量SQL仅选择在最近y天内玩过x次游戏的玩家?

这全部用于游戏阶梯。我使用两个表格:weblPlayers只有用户信息(用户名,电子邮件,密码等),weblGames会报告每个已报告的游戏的结果以及日期和时间,格式正确的报告。

这里是他们的截图:

weblGames

WeblPlayers有字段:player_id |名称|电子邮件| etc |等等。在报告游戏时发现weblGames中的赢家或失败者的名字对应于在WeblPlayers中找到的相同名称。

回答

2
SELECT userid, count(*) as numgames 
from weblGames g 
where g.dateplayed >= now() - y 
group by userid 
having count(*) > x 
; 

您可以随时将其加入weblPlayers以获取其余信息。

[编辑]

对不起 - 没有注意到的赢家和输家的事情。尝试:

SELECT userid, count(*) as cnt 
FROM 
(
    SELECT winner as userid 
    from weblGames g 
    where g.reported_on >= now() - y 
    UNION ALL 
    SELECT loser as userid 
    from weblGames g 
    where g.reported_on >= now() - y 
) t 
GROUP BY userid 
HAVING COUNT(*) > x; 
+0

非常感谢=)这是完美的,只需要在y之后的“日”。下面会选择每一个起到3场或更多的比赛,最近4天球员: SELECT用户ID,COUNT(*)AS CNT FROM( SELECT得主AS用户ID FROM webl_games摹 WHERE g.reported_on>现在() - INTERVAL 4 DAY UNION ALL SELECT失败者AS的userid FROM webl_games克 WHERE g.reported_on>现在() - INTERVAL 4 DAY )吨 GROUP BY的userid HAVING COUNT(*)> = 3 – eyerouge 2009-08-06 01:32:48

+0

噢,呃...我没有考虑INTERVAL功能。 – 2009-08-06 01:39:58

1

这是在MSSQL语法,但给你的想法。唯一不可携带的东西应该是DATEADD|DIFF以获得今天的日期。

SELECT Name 
FROM (
    SELECT 
     winner as Name, 
     reported_on 
    FROM webIGames 
    UNION ALL 
    SELECT 
     loser as Name, 
     reported_on 
    FROM webIGames 
) as AllPlayers 
WHERE 
    reported_on >= DATEADD(dd, 0 + @y, DATEDIFF(dd, 0, GETDATE())) 
GROUP BY 
    Name 
HAVING 
    COUNT(*) > @x 

诀窍就是一个)同时获得赢家和输家(在UNION ALL),并使用HAVING限制GROUP BY后的结果。