Необходимо найти значение в столбце 'num_sensor' (>1), определить по 'id-sensor' последнюю строку и из нее получить значение 'num_cell'
public ResultSet numCellInSensor(Sensor numSensor) {
ResultSet resSet = null;
String numSENSOR = sensor.getSensor_number();
String select = "SELECT 'num_sensor', MAX('id-sensor'),'num_cell'
FROM my_table
WHERE 'num_sensor' = " + numSENSOR +
" GROUP BY 'num_sensor','num_cell' HAVING MAX('id-sensor')";
try {
PreparedStatement prSt = getDbConnection().prepareStatement(select);
resSet = prSt.executeQuery();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return resSet;
}
При выполнении запроса в цикл попадают все номера, а нужно чтобы попадала последняя запись.
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Можно выбрать одну подходящую строку без группировки:
- отфильтровать значения по полю
num_sensorв частиWHERE - отсортировать по полю
id-sensorпо убыванию, чтобы первым оказалось максимальное значение при помощиORDER BY - выбрать единственную подходящую строку при помощи
LIMIT 1
Тогда метод getData вернёт пустой экземпляр Optional, если подходящие данные не будут найдены или же обёртку с требуемым значением num_cell.
private static final String SQL = """
SELECT `num_cell`, `id-sensor`
FROM my_table
WHERE `num_sensor` = ?
ORDER BY `id-sensor` DESC
LIMIT 1
""";
public static Optional<Object> getData(Object numPerson, Connection conn) {
try (PreparedStatement ps = conn.prepareStatement(SQL)) {
ps.setObject(1, numPerson);
ResultSet set = ps.executeQuery();
return set.next()
? Optional.of(set.getObject("num_cell"))
: Optional.empty();
} catch (SQLException e) {
throw new RuntimeException("Ошибка выполнения запроса: " + SQL
+ "; numPerson= " + numPerson, e);
}
}
Разумеется, вернуть можно любой другой требуемый объект с полями, а не только одно значение num_cell.