124 lines
3.7 KiB
SQL
124 lines
3.7 KiB
SQL
-- ============================================================
|
||
-- Проверочные запросы v2
|
||
-- ============================================================
|
||
|
||
-- 1. Все тренировки клиента с типом тренировки
|
||
SELECT
|
||
c.full_name,
|
||
w.start_time,
|
||
wt.name AS workout_type,
|
||
w.notes,
|
||
CASE WHEN w.end_time IS NULL THEN '🔥 Активная' ELSE '✅ Завершена' END AS status
|
||
FROM workouts w
|
||
JOIN clients c ON c.id = w.client_id
|
||
LEFT JOIN workout_types wt ON wt.id = w.workout_type_id
|
||
ORDER BY w.start_time DESC;
|
||
|
||
-- 2. Полная тренировка с дроп-сетами
|
||
SELECT
|
||
w.start_time,
|
||
wt.name AS workout_type,
|
||
we.exercise_name,
|
||
CASE
|
||
WHEN s.is_dropset = 0 THEN printf('%s кг × %s', s.weight, s.reps)
|
||
ELSE '🔥 DROPSET'
|
||
END AS set_info,
|
||
s.rating
|
||
FROM workouts w
|
||
LEFT JOIN workout_types wt ON wt.id = w.workout_type_id
|
||
JOIN workout_exercises we ON we.workout_id = w.id
|
||
JOIN sets s ON s.workout_exercise_id = we.id
|
||
WHERE w.id = 1
|
||
ORDER BY we.sort_order, s.sort_order;
|
||
|
||
-- 3. Элементы дроп-сета
|
||
SELECT
|
||
s.id AS set_id,
|
||
di.sort_order,
|
||
di.weight,
|
||
di.reps
|
||
FROM sets s
|
||
JOIN dropset_items di ON di.set_id = s.id
|
||
WHERE s.is_dropset = 1
|
||
ORDER BY s.id, di.sort_order;
|
||
|
||
-- 4. История упражнения (для подсказок)
|
||
SELECT
|
||
w.start_time,
|
||
s.weight,
|
||
s.reps,
|
||
s.is_dropset
|
||
FROM workout_exercises we
|
||
JOIN sets s ON s.workout_exercise_id = we.id
|
||
JOIN workouts w ON w.id = we.workout_id
|
||
WHERE we.exercise_name = 'Горизонтальная тяга'
|
||
AND w.end_time IS NOT NULL
|
||
ORDER BY w.start_time DESC
|
||
LIMIT 10;
|
||
|
||
-- 5. Динамика замеров клиента (для дашборда)
|
||
SELECT
|
||
bm.metric_date,
|
||
mt.name AS metric_name,
|
||
mt.unit,
|
||
bmv.value
|
||
FROM body_metrics bm
|
||
JOIN body_metric_values bmv ON bmv.body_metric_id = bm.id
|
||
JOIN metric_types mt ON mt.id = bmv.metric_type_id
|
||
WHERE bm.client_id = 1
|
||
ORDER BY bm.metric_date DESC, mt.sort_order;
|
||
|
||
-- 6. Динамика конкретного замера (например, бицепс)
|
||
SELECT
|
||
date(bm.metric_date) AS day,
|
||
bmv.value
|
||
FROM body_metrics bm
|
||
JOIN body_metric_values bmv ON bmv.body_metric_id = bm.id
|
||
JOIN metric_types mt ON mt.id = bmv.metric_type_id
|
||
WHERE bm.client_id = 1
|
||
AND mt.name = 'Бицепс'
|
||
ORDER BY bm.metric_date DESC;
|
||
|
||
-- 7. Статистика по клиентам (для тренера)
|
||
SELECT
|
||
c.full_name,
|
||
c.goal,
|
||
COUNT(DISTINCT w.id) AS total_workouts,
|
||
SUM(CASE WHEN w.end_time IS NOT NULL THEN 1 ELSE 0 END) AS completed,
|
||
MAX(w.start_time) AS last_workout
|
||
FROM clients c
|
||
LEFT JOIN workouts w ON w.client_id = c.id
|
||
GROUP BY c.id
|
||
ORDER BY last_workout DESC;
|
||
|
||
-- 8. Тренировки клиента за последнюю неделю
|
||
SELECT
|
||
w.start_time,
|
||
wt.name AS workout_type,
|
||
COUNT(DISTINCT we.id) AS exercises_count,
|
||
SUM(CASE WHEN s.is_dropset = 0 THEN 1 ELSE (SELECT COUNT(*) FROM dropset_items WHERE set_id = s.id) END) AS total_sets
|
||
FROM workouts w
|
||
LEFT JOIN workout_types wt ON wt.id = w.workout_type_id
|
||
LEFT JOIN workout_exercises we ON we.workout_id = w.id
|
||
LEFT JOIN sets s ON s.workout_exercise_id = we.id
|
||
WHERE w.client_id = 1
|
||
AND w.start_time >= date('now', '-7 days')
|
||
GROUP BY w.id
|
||
ORDER BY w.start_time DESC;
|
||
|
||
-- 9. Все упражнения с их типами тренировок
|
||
SELECT
|
||
e.name,
|
||
wt.name AS workout_type
|
||
FROM exercises e
|
||
LEFT JOIN workout_types wt ON wt.id = e.workout_type_id
|
||
ORDER BY wt.sort_order, e.name;
|
||
|
||
-- 10. Все доступные типы замеров
|
||
SELECT
|
||
name,
|
||
unit,
|
||
category
|
||
FROM metric_types
|
||
ORDER BY sort_order;
|