escape($filter['order']); } $limit = ''; if (isset($filter['limit'])) { $limit = ' LIMIT ' . intval($filter['limit']); } $sql = "SELECT * FROM Measurement" . $whereClause . $order . $limit; $res = $db->query($sql); $measurements = []; while ($row = $db->fetch_object($res)) { $measurement = new Measurement(); $measurement->load($row); $measurements[] = $measurement; } return $measurements; } public static function getLatestGroupedByDeviceAndSensor($limit = 50) { $db = FronkDB::singleton(); // Get the most recent measurements, grouped by unique device_id and sensor_id combinations // This query gets the latest measurement for each device_id/sensor_id combination $sql = " SELECT m.* FROM Measurement m INNER JOIN ( SELECT device_id, sensor_id, MAX(`create`) as max_create FROM ( SELECT device_id, sensor_id, `create` FROM Measurement ORDER BY `create` DESC LIMIT 1000 ) AS recent GROUP BY device_id, sensor_id ) AS latest ON m.device_id = latest.device_id AND m.sensor_id = latest.sensor_id AND m.`create` = latest.max_create ORDER BY m.`create` DESC LIMIT " . intval($limit); $res = $db->query($sql); $measurements = []; while ($row = $db->fetch_object($res)) { $measurement = new Measurement(); $measurement->load($row); $measurements[] = $measurement; } return $measurements; } }