| | 343 | |
| | 344 | == Views == |
| | 345 | |
| | 346 | -- 1. User Profile Overview |
| | 347 | CREATE VIEW vw_user_profile AS |
| | 348 | SELECT |
| | 349 | u.id, |
| | 350 | u.email, |
| | 351 | u.height, |
| | 352 | u.weight, |
| | 353 | u.gender, |
| | 354 | u.created_at, |
| | 355 | r.name AS role, |
| | 356 | d.name AS active_diet, |
| | 357 | ud.start_date AS diet_start, |
| | 358 | ud.end_date AS diet_end |
| | 359 | FROM "User" u |
| | 360 | LEFT JOIN User_roles ur ON u.id = ur.user_id |
| | 361 | LEFT JOIN Roles r ON ur.role_id = r.id |
| | 362 | LEFT JOIN User_Diets ud ON u.id = ud.user_id |
| | 363 | LEFT JOIN Diet d ON ud.Diet_id = d.id; |
| | 364 | |
| | 365 | -- 2. Daily Food Log Summary |
| | 366 | CREATE VIEW vw_daily_food_summary AS |
| | 367 | SELECT |
| | 368 | fl.UserId, |
| | 369 | DATE(fl.dateTime) AS log_date, |
| | 370 | fl.meal_type, |
| | 371 | SUM(CASE WHEN LOWER(n.nutrient) LIKE '%energy-kcal%' |
| | 372 | THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_calories, |
| | 373 | SUM(CASE WHEN LOWER(n.nutrient) LIKE '%protein%' |
| | 374 | THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_protein, |
| | 375 | SUM(CASE WHEN LOWER(n.nutrient) LIKE '%fat%' |
| | 376 | THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_fat, |
| | 377 | SUM(CASE WHEN LOWER(n.nutrient) LIKE '%carbohydrate%' |
| | 378 | THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_carbs, |
| | 379 | COUNT(fl.id) AS total_entries |
| | 380 | FROM FoodLogs fl |
| | 381 | JOIN Food_nutrients fn ON fl.FoodId = fn.FoodId |
| | 382 | JOIN Nutrient n ON fn.NutrientId = n.id |
| | 383 | GROUP BY fl.UserId, DATE(fl.dateTime), fl.meal_type; |
| | 384 | |
| | 385 | -- 3. Exercise Calories Burned per User |
| | 386 | CREATE VIEW vw_user_calories_burned AS |
| | 387 | SELECT |
| | 388 | al.UserId, |
| | 389 | DATE(al.dateTime) AS log_date, |
| | 390 | SUM(al.Calories_burned) AS total_calories_burned, |
| | 391 | SUM(al.Duration_minutes) AS total_minutes, |
| | 392 | COUNT(al.id) AS total_sessions |
| | 393 | FROM ActivityLogs al |
| | 394 | GROUP BY al.UserId, DATE(al.dateTime); |
| | 395 | |
| | 396 | -- 4. Food Nutritional Info |
| | 397 | CREATE VIEW vw_food_nutrition AS |
| | 398 | SELECT |
| | 399 | f.id AS food_id, |
| | 400 | f.name AS food_name, |
| | 401 | f.calories_per_100g, |
| | 402 | c.name AS category, |
| | 403 | n.nutrient AS nutrient_name, |
| | 404 | fn.amount, |
| | 405 | fn.unit |
| | 406 | FROM Food f |
| | 407 | LEFT JOIN Category c ON f.category_id = c.category_id |
| | 408 | LEFT JOIN Food_nutrients fn ON f.id = fn.FoodId |
| | 409 | LEFT JOIN Nutrient n ON fn.NutrientId = n.id; |
| | 410 | |
| | 411 | -- 5. User Achievements Progress |
| | 412 | CREATE VIEW vw_user_achievements AS |
| | 413 | SELECT |
| | 414 | u.id AS user_id, |
| | 415 | u.email, |
| | 416 | a.name AS achievement_name, |
| | 417 | a.requirement_type, |
| | 418 | a.target_value, |
| | 419 | a.period_type, |
| | 420 | ua.dateEarned |
| | 421 | FROM "User" u |
| | 422 | JOIN User_achievements ua ON u.id = ua.user_id |
| | 423 | JOIN Achievements a ON ua.achievement_id = a.id |
| | 424 | ORDER BY ua.dateEarned DESC; |
| | 425 | |
| | 426 | -- 6. User Streak Summary |
| | 427 | CREATE VIEW vw_user_streaks AS |
| | 428 | SELECT |
| | 429 | u.id AS user_id, |
| | 430 | u.email, |
| | 431 | st.name AS streak_type, |
| | 432 | st.metric_type, |
| | 433 | s.current_count, |
| | 434 | s.longest_count, |
| | 435 | s.last_updated |
| | 436 | FROM "User" u |
| | 437 | JOIN Streak s ON u.id = s.User_id |
| | 438 | JOIN Streak_type st ON s.Streak_type_id = st.id; |
| | 439 | |
| | 440 | -- 7. Body Measurements History |
| | 441 | CREATE VIEW vw_body_measurements AS |
| | 442 | SELECT |
| | 443 | u.id AS user_id, |
| | 444 | u.email, |
| | 445 | bm.weight, |
| | 446 | bm.waist, |
| | 447 | bm.body_fat, |
| | 448 | bm.dateTime AS measured_at |
| | 449 | FROM "User" u |
| | 450 | JOIN BodyMeasurements bm ON u.id = bm.User_id |
| | 451 | ORDER BY bm.dateTime DESC; |
| | 452 | |
| | 453 | -- 8. Diet Plan Details |
| | 454 | CREATE VIEW vw_diet_plan AS |
| | 455 | SELECT |
| | 456 | d.id AS diet_id, |
| | 457 | d.name AS diet_name, |
| | 458 | d.calorie_target, |
| | 459 | d.protein_target, |
| | 460 | d.carb_target, |
| | 461 | d.fat_target, |
| | 462 | f.name AS food_name, |
| | 463 | df.amount AS food_amount, |
| | 464 | df.unit AS food_unit, |
| | 465 | e.name AS exercise_name, |
| | 466 | det.frequency_per_week |
| | 467 | FROM Diet d |
| | 468 | LEFT JOIN Diet_foods df ON d.id = df.DietId |
| | 469 | LEFT JOIN Food f ON df.FoodId = f.id |
| | 470 | LEFT JOIN Diet_Exercise_Targets det ON d.id = det.DietId |
| | 471 | LEFT JOIN Exercise e ON det.ExerciseId = e.id; |
| | 472 | |
| | 473 | -- 9. Exercise Library |
| | 474 | CREATE VIEW vw_exercise_library AS |
| | 475 | SELECT |
| | 476 | e.id AS exercise_id, |
| | 477 | e.name AS exercise_name, |
| | 478 | e.calories_per_minute, |
| | 479 | a.name AS activity_type, |
| | 480 | STRING_AGG(m.name, ', ') AS muscles_targeted |
| | 481 | FROM Exercise e |
| | 482 | LEFT JOIN Activity a ON e.activity_id = a.id |
| | 483 | LEFT JOIN Exercise_muscles em ON e.id = em.Exercise_id |
| | 484 | LEFT JOIN Muscle m ON em.Muscle_id = m.id |
| | 485 | GROUP BY e.id, e.name, e.calories_per_minute, a.name; |
| | 486 | |