【问题标题】:SQL - Selecting random rows and combining into a new tableSQL - 选择随机行并组合成一个新表
【发布时间】:2013-10-20 11:54:17
【问题描述】:

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

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 值和 questions.id 值将它们放入 gameQuestions 表中。

实现此目的的最佳方法是什么?我可以用几个不同的 sql 查询来做到这一点,但我觉得真正熟练使用 sql 的人可以让它更有效率。我正在使用 sqlite3。

【问题讨论】:

  • 我认为必须是两个查询,因为您需要限制 QuestionCount,据我所知,限制必须是文字。

标签: sql sqlite subquery


【解决方案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 可以正常工作并产生所需的结果。我没有测试过旧版本。

【讨论】:

  • 很好,我在找那个,没找到。
猜你喜欢
  • 2021-03-14
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2022-01-06
  • 1970-01-01
  • 2010-10-25
  • 2019-03-15
相关资源
最近更新 更多