2012-02-10 126 views
-1

好,所以我知道还有其他类似的问题。但我的有一点不同......5星评级系统mysql设置

我要和这些比赛的所有信息的列表,我需要显示游戏平均得分与他们的信息一起...

如此,我不想有2个表“游戏”和“games_ratings”因为那样的话我不能做一个简单的

SELECT id, name, howtoplay, otherinfo, avrating FROM games ORDER BY id; 

这将是很好,如果有一个聪明的办法,我可以有一个5星级评级系统,可记住用户和可以在一张表中显示所有信息的平均值。

我不知道很多关于mysql的限制。我应该一次运行2个查询吗?我总是试图限制每个页面只有一个查询。特别是如果我的第一个查询将加载50个游戏来显示有关信息。

我意识到系统的收视表就像是userid,songid,rating,你只需选择平均值。

+0

有了你提出的系统,你将如何判断一个用户是否已经对游戏进行了评分?或者他们将如何改变他们的评分? – Tim 2012-02-10 06:29:18

+0

以及我所知道的那个2表)用户ID存储与他们的投票。但即时通讯问,如果有人知道更多关于MySQL比我,并可以建议在另一个表中做这个的方式有可能不是,但数字ID问 – brybam 2012-02-10 06:31:03

+0

尝试改进你的问题多一点。我认为你可能没有对你的最终结果有足够清晰的定义。看看下面的示例并尝试使用它们。让我们从那里了解您的问题。 – 2012-02-10 06:44:56

回答

4

因为我认为你可能不仅仅是mysql的新手,而且对于建模也有点新意,所以我会在这里出现一条腿。

我会为这个想法推荐3张桌子。

  1. 用户表
  2. UserRatings表
  3. 游戏台

用户表用于存储这一点。用户信息。例如,可能是用户名,密码,名字,姓氏。该表应该有一个主键。将其称为UsersID。它应该自动增量并且对每一行都是唯一的。

游戏桌旁边是。在其中放入一个游戏名称。它也应该有一个主键。称它为GameID。

最后是UserRatings表。即使在关联类型表中,我也喜欢复合键上的主键,但您也可以使用该路线。说UserRatingsId,评级,InsertTimeStamp,UpdateTimeStamp。

现在要存储平均评分,我会查看另一个表格,或者在游戏桌中放置评分栏。每次在UserRatings表中插入/更新一行时,都会触发该列或表的重构。

另外,连接是你的朋友。对他们进行一些阅读。忽略外部,内部,交叉,左边,右边等,直到你熟悉简单的直接连接的概念(并且它被称为许多事物)。

尝试一下上面提供的答案和这一个。我猜你的问题一旦开始玩了,就会更有针对性。

干杯

马特

+0

其实我不会推荐将平均评分作为单独的字段存储。 OP将需要做大量的工作来确保数据的一致性 - 例如在UserRatings插入/更新/删除等操作中添加多个触发器。所有其他点都很有用,所以+1 – 2012-02-10 06:50:11

+0

是的,有很多方法可以存储它。他并没有表明需要更复杂的东西,而是提供了很多很好的答案。感谢+1 – 2012-02-13 06:34:17

0

我相信没有有效的这种信息存储在一个表中的方式。如果你希望它只是在一个表中,只是为了查询简单,那么我建议使用视图。让我们想象一下,你有独立的游戏信息表和评分表(是的,你不喜欢的方法:))。事情是这样的:

CREATE TABLE games(id INT AUTO_INCREMENT, name VARCHAR(255), howtoplay TEXT, otherinfo TEXT); 

CREATE TABLE ratings(game_id INT, user_id INT, rating INT); 

然后你就可以做到以下几点:

CREATE VIEW games_with_ratings AS SELECT id, name, otherinfo, howtoplay, AVG(rating) AS avrating FROM games LEFT JOIN ratings ON games.id=ratings.game_id GROUP BY id; 

你必须这样做一次,之后你就可以,就像你要查询这个观点在原始问题:

SELECT id, name, howtoplay, otherinfo, avrating FROM games_with_ratings ORDER BY id; 
+0

我真的不知道太多关于MySQL。只是基础知识,可能是一些功能,限制等。即时通讯不知道你是什么意思的“查看”是不好的在我的PHP函数中运行2选择查询。这是正常的吗?我真的没有什么太多的概念。我一直试图一次做1个查询。 – brybam 2012-02-10 06:32:25

+0

更新了我的答案。 – 2012-02-10 06:37:14

+0

oohhh所以一个视图是一种方法来查询来自两个表的信息一次...所以我可以做1个查询,就像我说的...? – brybam 2012-02-10 06:37:57

0

可以保持平均和总的games表。当您添加新的评级时:

UPDATE games SET 
    average=((average*totalvotes)+{$votescore})/(totalvotes+1), 
    totalvotes=totalvotes+1 
WHERE id={$id} 

这比每次重新计算平均值效率更高。

但是,要记住谁是什么,最好的办法是用(useridgameidscore)保存为InnoDB表一表表决。

+0

我如何从我的'games_ratings'中获取信息到我的'游戏'表中的平均列中?在我为'游戏评分'表做'插入'之后......应该让mysql像返回新的平均值然后运行游戏更新? – brybam 2012-02-10 06:34:53

+0

你没有。你在你的游戏表中添加'average'和'totalvotes'这两列,默认为0,然后让上面的代码在投票时做好工作。 – 2012-02-10 06:36:07

1

你说:

,如果有一个聪明的办法,我可以有一个5星级评级系统,可记住用户并能显示平均就好将所有信息与所有信息一起显示在一张表中。

您必须已有用户表。 “记住”投票参与游戏的用户的唯一方法是通过FK键入用户ID。现在,如果你有一个混合用户和游戏的话,你的表将正常化不足,将有以下形式:

+--------+----------------+------------------------+--------+------+ 
| GameId | GameName | GameDescription  | User | Vote | 
+--------+----------------+------------------------+--------+------+ 
|  1 | Counter Strike | An addicting FPS game! | Timmy | 3 | 
|  1 | Counter Strike | An addicting FPS game! | Martin | 5 | 
|  1 | Counter Strike | An addicting FPS game! | Moe | 2 | 
|  2 | Halo   | Other addicting game | Timmy | 2 | 
|  2 | Halo   | Other addicting game | Sonny | 2 | 
+--------+----------------+------------------------+--------+------+ 

这是不是很标准化...其实,你得GameDescription和GameName反复到处!在这种情况下,你的PK将是GameId和User。迟早你会后悔的。所以,不要为此而去。去这样的:

游戏(PK:游戏ID)

+--------+----------------+------------------------+ 
| GameId | GameName | GameDescription  | 
+--------+----------------+------------------------+ 
|  1 | Counter Strike | An addicting FPS game! | 
|  2 | Halo   | Other addicting game | 
+--------+----------------+------------------------+ 

用户(PK:用户)

+--------+ 
| User | 
+--------+ 
| Timmy | 
| Martin | 
| Moe | 
+--------+ 

投票(PK:游戏ID和用户)

+--------+--------+------+ 
| GameId | User | Vote | 
+--------+--------+------+ 
|  1 | Timmy | 3 | 
|  1 | Martin | 5 | 
|  1 | Moe | 2 | 
|  2 | Timmy | 2 | 
|  2 | Sonny | 2 | 
+--------+--------+------+ 

注意:我假设用户名是PK,也可以使用整数userId,但这样更易于阅读。

我知道加入吸吮但他们会帮助你超过他们会伤害你。

现在,你如何改进平均计算?那么,对于每场比赛,你可以有另一个栏目,如TotalVotes,其中将持有总票数和另一栏SumVotes,其中将持有该游戏的所有选票的总和。因此,当投票数增加一个TotalVotes列时,您将SumVotes添加到SumVotes用户分配给游戏的开始数量。

然后,为了显示平均,只是执行两个值的划分(这是不是加入扫描表快得多重新计算此。

好了,我希望这可以帮助或指导你到一个更好的解决方案。祝你好运!