Необходимо найти значение в столбце 'num_sensor' (>1), определить по 'id-sensor' последнюю строку и из нее получить значение 'num_cell'

Рейтинг: 1Ответов: 1Опубликовано: 24.05.2023
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Принят

Можно выбрать одну подходящую строку без группировки:

  • отфильтровать значения по полю 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.