0

我目前正在尝试获取以下数据:

用户名、UserImageURL、已玩游戏总数、已完成游戏、输掉游戏、平均获胜(百分比)和用户积分

还有另一组数据:

用户统计数据,例如:

  • 联盟中玩的最多游戏:23 - Monster Killers
  • 赢得最多的游戏:19/23 - Monster Killers
  • 最迷失的游戏:3/32 - Frog Racers
  • 您的游戏获胜准确率(所有游戏的总和)- 68% 准确率

网站统计:

  • 联赛中玩的最多的游戏:650 - 直升机奔跑
  • 热门游戏:1200 - Monster Killers
  • 全站中标准确率:82%

我有以下表格:

-用户表-

userID (int-pk), userName (varchar), userImageUrl (text)

-游戏桌-

gameId (int-pk), gameName (varchar), gameUserID (int), gameLeagueId (int), score1 (int), score2 (int), gameResultOut (0 or 1), gameWon (0 or 1)

-用户余额表-

ubId(int-pk) userId (int) balance (int)

-联赛表- LeagueId (int-pk) LeagueName (varchar)

只是为了让您了解正在发生的事情,当用户玩游戏并选择一些结果时,会在游戏表中插入一行。由于游戏是基于时间的,所以当结果出来时,会检查是否有任何游戏具有该 id,并将根据用户选择的内容将 gameResultOut 更新为 1 并将 gameWon 更新为 1 或 0分数。

我尝试了以下方法:

SELECT u.userID, u.userName, u.userImageUrl, l.leagueName , 
COUNT(g.gameId) AS predTotal, 
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 1) AS gamesWon,
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 0) AS gamesLost, 
ub.balance 
FROM games AS g
LEFT JOIN league AS l ON l.leagueId = g.gameLeagueId 
LEFT JOIN user AS u ON u.user_id = g.gameUserID 
LEFT JOIN user_balance AS ub ON ub.userId = u.userID 
WHERE l.leagueId = 4
GROUP BY u.userId 
ORDER BY ub.balance DESC

我可以在查询后轻松计算获胜百分比,所以这不是问题,但是获胜和失败的结果都是相同的,即使在更改 leageId 时,结果仍然相同,这不是我想要的.

任何人都可以帮忙吗?

谢谢和问候, 死灵

4

1 回答 1

1

据我所知,游戏桌存储了用户玩过的游戏。因此,为了了解每个用户玩/赢/输了多少游戏,您缺少gamesusers子查询中的链接。

您的子查询是:

(SELECT COUNT(g.gameId ) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 1) AS gamesWon,
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 0) AS gamesLost, 

他们应该是:

(SELECT COUNT(gw.gameId ) FROM games AS gw WHERE gw.gameResultOut = 1 AND gw.gameWon = 1 AND gw.gameUserID = u.user_id) AS gamesWon,
(SELECT COUNT(gl.gameId) FROM games AS gl WHERE gl.gameResultOut = 1 AND gl.gameWon = 0 AND gl.gameUserID = u.user_id) AS gamesLost, 

我想这就是你要找的:)


根据评论进行编辑,为用户和网站统计添加提示:

对于这些信息,您需要执行几个不同的查询,因为它们中的大多数将按给定列对某些值和/或分组求和,这不适合另一个查询。我会尝试给你一些想法,这样你就可以研究它们。

用户统计

大多数游戏赢或输

您提供的查询的先前答案计算了用户输/赢任何游戏的次数,但不区分游戏之间的此数据。

所以,如果你想知道哪个游戏用户的赢/输最多,你应该有这样的东西:

SELECT
    g.gameName,
    -- How many times the user won per game
    (SELECT COUNT(gw.gameId) FROM games gw WHERE gw.gameResultOut = 1 AND gw.gameWon = 1 AND  gw.gameUserID = u.user_id) AS gamesWon,
    -- How many times the user payed each game
    COUNT(g.gameId) AS gamesPlayed,
    -- The Win Ratio. This may need a little work on, depending on what you want.
    -- Be aware that if a user played a game 1 time and won, it's ratio will be 1 (100%)
    -- So maybe you'll want to add your own rule to determine which game should show up here
    (gamesWon / gamesPlayed) AS winRatio
FROM
    games g
    INNER JOIN user u ON u.user_id = g.gameUserID 
-- Groups and counts data based on games + users
GROUP BY g.gameId, u.user_id
-- Now you order by the win ratio
ORDER BY winRatio DESC
-- And get only the first result, which means the game the player has most wins.
LIMIT 1

对于输掉的比赛,它几乎是相同的查询,改变所需的字段和数学。

比赛胜率

有点像以前的查询,除了您不再按游戏ID 分组。只需按用户分组并进行数学计算。

网站统计

好吧,据我所知,我们仍在进行类似的查询。不同之处在于,对于整个站点统计信息,您永远不会按用户分组。您可以按游戏或联赛分组,具体取决于您要达到的目标。


底线:看起来大多数查询都是相似的,您必须使用它们并适应您需要检索的每个信息。请注意,它们可能无法正常工作,因为我无法在您的数据库上对其进行测试。您可能需要根据您的数据库/表架构更正一些不一致的地方。

我希望这可以让你对工作有所了解。

于 2013-09-11T14:57:50.533 回答