1

これが私のテーブルの作成です...

CREATE TABLE questions(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    question VARCHAR(256) UNIQUE NOT NULL,
    rangeMin INTEGER,
    rangeMax INTEGER,
    level INTEGER NOT NULL,
    totalRatings INTEGER DEFAULT 0,
    totalStars INTEGER DEFAULT 0
);

CREATE TABLE games(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    level INTEGER NOT NULL,
    inclusive BOOL NOT NULL DEFAULT 0,
    active BOOL NOT NULL DEFAULT 0,
    questionCount INTEGER NOT NULL,
    completedCount INTEGER DEFAULT 0,
    startTime DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE gameQuestions(
    gameId INTEGER,
    questionId INTEGER,
    asked BOOL DEFAULT 0,
    FOREIGN KEY(gameId) REFERENCES games(id),
    FOREIGN KEY(questionId) REFERENCES questions(id)
);

私が行っている完全な手順を説明してから、入力を求めます。

する必要がある...

  1. games.id 値を使用して、そのゲームの games.questionCount と games.level を検索します。
  2. games.questionCount と games.level があるので、questions テーブルのすべての行を questions.level = games.level で調べて、games.questionCount をランダムに選択する必要があります。
  3. ステップ 2 で取得した行 (質問とも呼ばれます) を使用して、games.id 値と question.id 値を使用してそれらを gameQuestions テーブルに配置する必要があります。

これを達成する最良の方法は何ですか?いくつかの異なるSQLクエリでそれを行うことができましたが、SQLに非常に熟練した誰かがそれをもう少し効率的に行うことができると思います. 私はsqlite3を使用しています。

4

1 に答える 1

2

これは、1 つのステートメントで実行されます。:game_id を処理したいゲーム ID としましょう。

insert into gameQuestions (gameId, questionId) 
select :game_id, id 
from questions 
where level = (select level from games where id = :game_id) 
order by random() 
limit (select questionCount from games where id = :game_id);

@Tony: sqlite docには、LIMIT が式を取ると書かれています。上記のステートメントは、sqlite 3.8.0.2 を使用して正常に機能し、目的の結果を生成します。古いバージョンはテストしていません。

于 2013-10-20T13:38:39.903 に答える