【问题标题】:SQL query use to return latest ID from mysql database, not it returns 99999SQL查询用于从mysql数据库返回最新ID,而不是返回99999
【发布时间】:2018-03-13 16:35:37
【问题描述】:

我的服务器会从数据库中检索最新的 ID,现在它被卡住并不断返回 id 99999,即使最新的 id 现在是 100040

我的代码是:

String insertTable = "SELECT * FROM dutyofcare ORDER BY Id DESC LIMIT 1";
ps = conn.prepareStatement(insertTable);
rs = ps.executeQuery();
String ResultS = "";
if (rs.next()) {
    ResultS += rs.getString("Id");
}

【问题讨论】:

  • 是的,因为它进行的是词汇排序,而不是数字排序。我猜你的 ID 列是 char 类型的?
  • 它从 1-99999 工作,我如何更改它以返回最新的 ID?
  • 这是 varchar,解决此问题的最佳方法是什么?我应该将其更改为 int 吗?
  • 为什么它是一个varchar,当你清楚地存储数字时?另外,与其做这样复杂的查询,为什么不使用SELECT MAX(id) FROM dutyofcare

标签: java mysql sql


【解决方案1】:

问题是您查询中的 ORDER BY 正在执行词法(逐个字符)排序,其中 9 总是 在 1 之后,而不是处理数字位置的数字排序。这是因为 ID 的列类型。您需要在排序完成之前确保 ID 是一个数字。

要么将您的 ID 更改为数字列类型并运行以下查询:

SELECT MAX(ID) from dutyofcare;

或者,如果您想保留列类型(效率低于上述选项):

select MAX(cast(ID AS UNSIGNED)) from dutyofcare;

或者,如果您想保留列类型并修复现有查询(所有选项中效率最低的)

select * from dutyofcare order by CAST(ID AS UNSIGNED) desc limit 1;

所有这些方法基本上都将ID视为数字并选择最大值。

【讨论】:

  • 这正是我所需要的,现在我明白它是按词汇排序排序的,这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多