SQLITE随机值/行与条件

时间:2018-08-27 12:20:51

标签: java sqlite random

因此,我知道有关在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(这意味着我没有结果)。但是,我在搜索文件名之前先打印了数据库,所以我确定所有者确实在该数据库中有相关的文件名。也许只有一个,但仍然是一个。

这使我想到一个问题:查询出了什么问题?

2 个答案:

答案 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注入的侵扰。