2012-02-10 125 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用戶分配給遊戲的開始數量。

然後,爲了顯示平均,只是執行兩個值的劃分(這是不是加入掃描錶快得多重新計算此。

好了,我希望這可以幫助或指導你到一個更好的解決方案。祝你好運!