36 lines
898 B
Rust
36 lines
898 B
Rust
|
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<Stat> {
|
||
|
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()
|
||
|
}
|
||
|
}
|