use serde::Serialize; use sqlx::{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.name, rowed_km: row.rowed_km.unwrap_or(0), }) .collect() } }