use serde::Serialize; use sqlx::{Row, FromRow, SqlitePool}; #[derive(FromRow, Serialize, Clone)] pub struct Stat { name: String, rowed_km: i32, } impl Stat { pub async fn get_rowed_km(db: &SqlitePool) -> Vec { sqlx::query( "SELECT u.name AS name, COALESCE(SUM(distance_in_km), 0) as rowed_km FROM user u INNER JOIN ( SELECT shipmaster AS user_id, distance_in_km FROM logbook UNION SELECT r.rower_id AS user_id, l.distance_in_km FROM logbook l INNER JOIN rower r ON r.logbook_id = l.id ) AS subquery ON u.id = subquery.user_id GROUP BY u.id ORDER BY rowed_km DESC;" ) .fetch_all(db) .await .unwrap() .into_iter() .map(|row| Stat { name: row.get("name"), rowed_km: row.get("rowed_km"), }) .collect() } }