【问题标题】:Java/MySQL - How to retrieve data from specific rowJava/MySQL - 如何从特定行检索数据
【发布时间】:2020-07-26 13:41:33
【问题描述】:

我真的找不到这个问题的解决方案:

这里我有两个结果集,一个总是显示存储在我的数据库中的项目数,另一个是从中检索所有数据。 我想生成一个随机数,然后根据我数据库中的行号/id 生成一个随机项。由于我还很新,我不确定这是否是一种有效的方法。检索所有数据然后每次都对其进行迭代看起来不是很干净。特别是如果我有 1000 件物品并且随机生成的数字是 999。

PreparedStatement randomSelection = con.prepareStatement("SELECT * FROM items ORDER BY RAND() LIMIT 1"); {
                String name = ((ResultSet) randomSelection).getString(2);
            
            System.out.println(name);
            }

尝试使用最后一行调用列 itemname。但是,我无法为这个问题寻找一个好的解决方案。非常感谢任何帮助,因为我对数据库还很陌生。

谢谢

编辑:这是我现在尝试的方法,但没有任何输出

同样的

ResultSet numberOfItemsInDataBase = stmt.executeQuery("SELECT count(*) FROM items;");
                // this will return a number between 0 and the number of rows - 1
                int id = new Random().nextInt(numberOfItemsInDataBase.getInt(1));
                ResultSet itemsInDataBase = stmt.executeQuery("select * from items order by id limit 1 offset " + id);
                if (itemsInDataBase.next()) {
                    String item = itemsInDataBase.getString(2);
                    System.out.println(item);
                }

【问题讨论】:

  • 您的 items 表是否有一个自动递增的主键,其连续值为 1,2,3,...?
  • 我的“id”是一个主键而不是 null 所以是的,它从 1,2 等开始。

标签: java mysql database


【解决方案1】:

如果你只需要一个随机的表行,那么你可以使用简单的 SQL 函数RAND()

ResultSet itemsInDataBase = stmt.executeQuery("select * from items order by rand() limit 1");
if (itemsInDataBase.next()) {
    item = new Item(itemsInDataBase.getString(2));
}

如果要使用生成的随机数,则在sql语句的OFFSET子句中使用:

ResultSet numberOfItemsInDataBase = stmt.executeQuery("SELECT count(*) FROM items;");
// the above query will return exactly 1 row
numberOfItemsInDataBase.next(); 
// this will return a number between 0 and the number of rows - 1
int id = new Random().nextInt(numberOfItemsInDataBase.getInt(1)); 
ResultSet itemsInDataBase = stmt.executeQuery("select * from items order by id limit 1 offset " + id);
if (itemsInDataBase.next()) {
    item = new Item(itemsInDataBase.getString(2));
}

【讨论】:

  • 你知道我的控制台没有输出吗?尝试了所有解决方案
  • 试试现在的代码。我错过了所有给next() 的电话。
  • 哦,祝福你,现在可以了!为什么这是解决它的方法?
  • 返回结果集时,索引将放在第一项之前。因此需要 next() 将索引设置为第一行(如果存在)。
【解决方案2】:

使用 ORDER BY RAND() 并将结果限制为 1。这样可以避免您必须查询计数,然后最终遍历 ResultSet 直到找到随机条目。

try (ResultSet randomSelection = connection
        .preparedStatement("SELECT * FROM items ORDER BY RAND() LIMIT 1")) {
    if (randomSelection.next()) {
        String name = randomSelection.getString(2);
    }
}

【讨论】:

  • 已更新,立即尝试。
【解决方案3】:

你可以使用limit函数来获取物品。

LIMIT 子句可用于限制SELECT 语句返回的行数。 LIMIT 接受一个或两个数字参数,它们都必须是非负整数常量(使用准备好的语句时除外)。

有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为 0(不是 1)。因此,在您的情况下,偏移量可以是随机生成的 id 减一,最大行数为 1:

select * from items LIMIT {id-1},1;  # Retrieve row (id-1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多