因此,我知道有关在SQL数据库中获取随机行的问题已经发布(甚至不止一次),它帮助我进行了以下SQL查询:
"SELECT column FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT 1)";
如果我很好理解,按随机顺序在大表上效率不高,但是如果将其与id配合使用,则速度足够快。
所以我尝试了一下,它似乎运行良好,但是后来我想添加一个条件,所以我做了一点改动:
"SELECT column1 FROM table WHERE (column2 LIKE '" + value + "' AND id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT 1)";
更清楚地说,我有此表:Uploaded =(ID,文件名,所有者)。 我想从给定的所有者中选择一个随机文件名。这给了我:
"SELECT filename FROM uploaded WHERE (owner LIKE '" + owner + "' AND id IN (SELECT id FROM uploaded ORDER BY RANDOM() LIMIT 1))";
问题是:有时rs.next为false(这意味着我没有结果)。但是,我在搜索文件名之前先打印了数据库,所以我确定所有者确实在该数据库中有相关的文件名。也许只有一个,但仍然是一个。
这使我想到一个问题:查询出了什么问题?
答案 0 :(得分:4)
您想获得owner
的随机ID,而不是任何ID。这就是为什么有时会得到空结果的原因。您获得的ID不适用于OWNER
,因此两个条件都不都是
因此在此查询中添加条件:
SELECT id FROM uploaded where owner = ? ORDER BY RANDOM() LIMIT 1
无需再次检查owner
,您已经为他得到了id
。所以:
SELECT filename FROM uploaded WHERE id IN (
SELECT id FROM uploaded where owner LIKE ? ORDER BY RANDOM() LIMIT 1
)
PS:这是使用PreparedStatement
表示法。
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, owner);
ResultSet rs = stmt.executeQuery();
我建议您选中它以防止出现任何SQL injection,或者可以用?
替换String
。
答案 1 :(得分:2)
问题是您选择了一个随机行,然后检查该列是否具有特定值。您应该通过将WHERE子句放在内部select上来进行其他操作:
"SELECT filename " +
"FROM uploaded " +
"WHERE id in " +
" (SELECT id " +
" FROM uploaded " +
" WHERE owner LIKE ? " +
" ORDER BY RANDOM() LIMIT 1)";
请注意,我使用?
而不是将所有者直接连接到查询中。您应该将正确的值作为参数传递给正确的SQLite函数。这称为绑定参数,它将确保您免受SQL注入的侵扰。