【问题标题】:SQLITE random value/row with criteria带有条件的 SQLITE 随机值/行
【发布时间】:2019-02-01 23:44:04
【问题描述】:

所以,我知道关于在 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)"; 

为了更清楚,我有这个表:上传 =(id,文件名,所有者)。 我想从给定的所有者中选择一个随机文件名。这给了我:

"SELECT filename FROM uploaded WHERE (owner LIKE '" + owner + "' AND id IN (SELECT id FROM uploaded ORDER BY RANDOM() LIMIT 1))";

问题是:有时,rs.next 是错误的(这意味着我没有结果)。但是,我在搜索文件名之前打印了数据库,所以我确信所有者在这个数据库中确实有一个相关的文件名。也许只有一个,但仍然是一个。

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

【问题讨论】:

  • 我可以确定 我的查询有什么问题? 是 SQL 注入的受害者
  • 好吧,你应该只得到 OWNER 的随机 ID...在这里你得到一个随机 ID 并期望它也归 owner 所有。

标签: java sqlite random


【解决方案1】:

您想获得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

【讨论】:

  • 感谢(感谢两个答案,它们几乎相同)。这很好用。我也想学习如何使用它?使用 SQL 查询,从而使两个答案合二为一!我会用它来改变我所有的 SQL 查询吗?现在:)
  • 关于 PreparedStatement 参数的重要一点,索引从 1 开始! @Ablia
  • 是的,我知道,我已经将它与 'VALUES(?,?)' 一起使用,但我不知道如何将它与其他东西一起使用。事实上,这几乎是一样的。
【解决方案2】:

问题在于您选择了一个随机行,然后检查该列是否具有特定值。您应该通过将 WHERE 子句放在内部选择上来执行此操作:

"SELECT filename " +
"FROM uploaded " +
"WHERE id in " +
"  (SELECT id " +
"   FROM uploaded " +
"   WHERE owner LIKE ? " +
"   ORDER BY RANDOM() LIMIT 1)";

请注意,我使用 ? 而不是将所有者直接连接到查询中。您应该将正确的值作为参数传递给正确的 SQLite 函数。这称为绑定参数,可确保您保护自己免受 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多