gpt4 book ai didi

java - SQLITE 随机值/带条件的行

转载 作者:行者123 更新时间:2023-12-02 12:18:28 34 4
gpt4 key购买 nike

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

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

最佳答案

您想要获取所有者的随机 ID,而不是任何 ID。这就是为什么有时你会得到空结果的原因。您获得的 ID 不属于 OWNER,因此这两个条件都不为 TRUE。

因此在此查询中添加条件:

SELECT id FROM uploaded where owner = ? ORDER BY RANDOM() LIMIT 1

无需两次检查所有者,您已经获得了他的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

关于java - SQLITE 随机值/带条件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52039262/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com