За последние 24 часа нас посетили 22696 программистов и 1265 роботов. Сейчас ищут 856 программистов ...

Помогите найти решение определения возрастной категории человека

Тема в разделе "Laravel", создана пользователем markelovdn, 15 авг 2022.

  1. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Версия Laravel: 8
    Версия PHP: 7.4
    Необходимо определить возрастную категорию человека на основании возрастного диапазона который находится в другой таблице:

    Есть таблица 1 в которой содержаться данные о дате рождения,

    в таблице 2 содержаться:
    название возрастной категории,
    стартовый возраст категории,
    конечный возраст категории.

    Пытаюсь понять как сделать так что бы при получении данных из таблицы 1, рассчитать возраст человека, сравнить его с диапазоном возрастов из таблицы 2, и подставить название возрастной категории
    советующей возрасту человека в итоговую коллекцию.
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    861
    Симпатии:
    132
    Урок не можете сдать?
    Опишите, что пробовали.
     
    markelovdn нравится это.
  3. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Нет не урок, делаю сервис регистрации на соревнования. В итоговой таблице на сайте участников напротив каждого участника должна отображаться возрастная его возрастная категория. Пока только получаю данные из модели участников, формирую коллекцию и вывожу на сайт в виде таблицы. Читаю документацию, пытаюсь понять какой метод позволит добавить в итоговую коллекцию участников еще одно поле в котором будет определяться возрастная категория. Возможно более правильно будет сделать через отношение одной таблицы к другой, но так на сколько я понимаю придется руками выставлять возрастную категорию, а хотелось что бы автоматически возрастная категория определялась на основании возраста участника.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Подзапрос делать надо
    --- Добавлено ---
    Таблицы покажите
    --- Добавлено ---
    Или можно уже на PHP обработать и проверить, когда данные получены. Может даже лучше будет
     
    markelovdn нравится это.
  5. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну тут бы я скорее на пыхе потом проверил, наверное... В зависимости от задачи. Но на пыхе будет более ясный код.
    Для определения возраста удобно использовать сразу TIMESTAMPDIFF https://www.w3resource.com/mysql/date-and-time-functions/mysql-timestampdiff-function.php
    Код (Text):
    1.  
    2. select
    3.       participants.*,
    4.       timestampdiff(years, now(), date_of_birth) as age,
    5.       (select name from age_groups where  timestampdiff(years, now(), date_of_birth) between age_start and age_finish) as age_group
    6. from partcipants
    Не отлаживал, естественно. На ларку сейчас переводить настроения нету, устал после спортзала.
     
    markelovdn нравится это.
  7. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Спасибо за ответ, запрос работает. Но походу данный способ не подойдет. Не сразу понял почему не работает, в сообщении об ошибке выводилось что подзапрос вернул больше одной строки. Потом дошло что у некоторых возраст попадает в разные диапазоны. Забыл сразу про это уточнить. Буду думать как это в контролере обработать силами php
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А что надо делать, если возраст попадает в разные диапазоны? У SQL большой пулл возможностей на самом деле, можно и подкорректировать
    --- Добавлено ---
    От элементарного limit 1, до агрегирующих функций
    --- Добавлено ---
    Вот так, к примеру
    Код (Text):
    1.  
    2. select
    3.       participants.*,
    4.       timestampdiff(years, now(), date_of_birth) as age,
    5.       (select group_concat(name) from age_groups where  timestampdiff(years, now(), date_of_birth) between age_start and age_finish) as age_groups
    6. from partcipants
    --- Добавлено ---
    https://www.w3resource.com/mysql/ag...egate-functions-and-grouping-group_concat.php
     
    markelovdn нравится это.
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Точно не в представление. Из SQL и PHP сам бы выбирал, хотя обычно стараюсь, чтоб мне всё база вывела. В реальном проекте запрос бы переписал на Query Builder. Младшая категория - по age_start? Тогда
    Код (Text):
    1.  
    2. select
    3.       participants.*,
    4.       timestampdiff(years, now(), date_of_birth) as age,
    5.       (select name from age_groups where  timestampdiff(years, now(), date_of_birth) between age_start and age_finish order by age_start limit 1) as age_group
    6. from partcipants
     
    markelovdn нравится это.
  10. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    По идеи, в таком случае планировал выбирать категорию с наименьшим возрастом.
    upload_2022-8-16_8-59-21.png
    Здесь видно что 16 лет попадает и в 15-17 и до 21 - надо выбрать 15-17, а 17,18,19,20 попадает до 21 и во Взрослые - надо выбрать до 21.
    Идея с конкатенацией хорошая и limit 1 тоже подойдет если будет выбираться младшая возрастная категория. В будущем думал в таком случае предлагать пользователю самому выбирать. Еще хотел уточнить, как будет правильнее, (так сказать с позиции наилучших практик), эту логику обрабатывать на уровне SQL или PHP, или вообще в представления ее запихнуть, и там уже может через VUE реализовывать ее.
    --- Добавлено ---
    С конкатенацией даже наверное лучше пока получается.
    upload_2022-8-16_9-0-1.png
    В ячейке получается строка которую потом уже можно по любой логике разложить так как надо и выбрать уже нужный возраст в зависимости от настроек соревнований.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    В принципе, именно php-программисты обычно отдают предпочтение SQL, java-программисты обычно любят сами ковыряться (по крайней мере те, с которыми мне доводилось работать).

    Но на самом деле, современные базы умеют очень-очень много
     
    markelovdn нравится это.
  12. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Спасибо за помощь, теперь буду думать как это правильно реализовать с моделями на ларавел, с моими знаниями надежды мало конечно, но если не получиться буду сырой запрос запихивать в обработчик.
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Тут, наверное, надо с другой стороны смотреть.
    Например:
    - подходит ли кандидат для участия в виде соревнований, регламент которых ограничен определённой возрастной группой?
    - в турнирах для каких возрастных групп может принимать участие кандидат?
    - самая младшая возрастная группа, с которой кандидат может заниматься?
    - самая старшая возрастная группа, с которой кандидат может заниматься?
    То есть "не просто так" подбирать возрастную группу, исходя из конкретной задачи для решения которой эта группа требуется.
    --- Добавлено ---
    Вот тут, наверное, действительно нужен список, если спортсмен подходит в условия для нескольких категорий.
     
    markelovdn нравится это.
  14. markelovdn

    markelovdn Новичок

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Согласен, все эти проверки будут нужны. Пока хотел на скорую руку сделать просто сбор заявок. В итоге сделал все с проверками внутри методов. Через SQL запросы не стал делать, кроме возраста ещё надо проверять весовую категорию, а она тоже зависит от возраста поэтому решил не строить сложных запросов.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну иногда сложные запросы спасают. Я на одном проекте недавно увеличил скорость ответа с 700 мс до 70мс просто перенеся логику в сложный запрос