-1

わかりましたので、このような質問が他にもあることを知っています。でも私のはちょっと違う…

これらのゲームのすべての情報を含むリストを作成し、ゲームの平均評価とその情報を表示する必要があります...

だから、「games」と「games_ratings」の 2 つのテーブルを持ちたくありません。

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

ユーザーを記憶し、情報とともに平均値をすべて 1 つの表に表示できる 5 つ星評価システムを実現できる賢い方法があればいいのですが。

私はmysqlの制限についてよく知りません。一度に 2 つのクエリを実行する必要がありますか? 私は常に、各ページを 1 つのクエリのみに制限しようとしました。特に、最初のクエリで 50 のゲームを読み込んで情報を表示する場合。

評価テーブルがユーザーID、ソングID、評価のようなもので、平均を選択するだけのシステムを認識しています。

4

4 に答える 4

4

あなたは mysql だけでなく、モデリングにも少し慣れていないのではないかと思うので、ここで手足を踏み出すつもりです。

このアイデアには 3 つのテーブルをお勧めします。

  1. ユーザー テーブル
  2. UserRatings テーブル
  3. ゲームテーブル

Users テーブルは、それを格納するために使用されます。ユーザー情報。おそらく、ユーザー名、パスワード、名、姓などです。テーブルには主キーが必要です。それをユーザーIDと呼びます。それ自体を自動インクリメントし、すべての行で一意にする必要があります。

次はゲームテーブルです。そこにゲーム名を入れます。主キーも必要です。それをゲーム ID と呼びます。

最後は UserRatings テーブルです。私は、連想型のテーブルであっても、複合キーよりも主キーのファンですが、そのルートをたどることもできます。UserRatingsId、Rating、InsertTimeStamp、UpdateTimeStamp と言います。

平均評価を保存するには、おそらく別のテーブルを参照するか、ゲーム テーブル内に評価列を配置します。UserRatings テーブルに行を挿入/更新するたびに、その列またはテーブルのリファクタリングを開始します。

また、ジョインはあなたの友達です。それらについて少し読んでください。単純な直線結合の概念 (および多くのことを呼び出す) に慣れるまで、outer、inner、cross、left、right などは無視してください。

上記の回答とこれを試してください。あなたがそれをいじり始めると、あなたの質問はより的を絞ったものになると思います.

乾杯

マット

于 2012-02-10T06:43:32.623 に答える
0

平均と合計をgames表に保持できます。新しい評価を追加する場合:

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

これは、毎回平均を再計算するよりもはるかに効率的です。

ただし、誰が何に投票したかを覚えておくには、( useridgameidscore) をテーブルとして保存するのが最善の方法ですInnoDB

于 2012-02-10T06:31:32.087 に答える
0

この情報を単一のテーブルに格納する効率的な方法はないと思います。クエリを簡単にするために 1 つのテーブルにまとめたい場合は、代わりにビューを使用することをお勧めします。

ゲーム情報用と評価用に別々のテーブルがあるとしましょう (はい、あなたが好まない方法です :))。このようなもの:

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;
于 2012-02-10T06:29:32.483 に答える