SQL - 选择随机行并组合成新表

时间:2013-10-20 11:54:18

标签: sql sqlite subquery

这是我的表格的创建......

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.level = games.level并随机选择games.questionCount。
  3. 现在我从步骤2得到的行(也就是问题),我需要使用games.id值和questions.id值将它们放入gameQuestions表。
  4. 最好的方法是什么?我可以用几个不同的sql查询来做到这一点,但我觉得像sql一样熟练的人可以让它发生更高效。我正在使用sqlite3。

1 个答案:

答案 0 :(得分:2)

这是在一个声明中。我们假设: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工作正常,并产生所需的结果。我还没有测试过旧版本。