Как получить возраст из столбца даты в базе данных с помощью SQL? - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь отобразить всех пользователей, которые находятся в определенном возрастном диапазоне (например, от 10 до 20), используя mysqli.По какому запросу лучше всего определить возраст и как?

В настоящее время у меня проблема с запросом, который не отображает точный результат.Я хочу, чтобы пользователи отображали возраст между этим и тем, но в приведенном ниже запросе не выдается никакой ошибки, вместо этого отображается даже возраст менее 10 или старше 20. У меня есть 2 таблицы user и user_likes.

        user
        username(pk)   gender   date_of_birth      country
          John           M        2010-12-31        India
          Bing           M        2000-12-31        Italy
          Rose           F        2000-12-01         UK

         user_likes 
         username(fk)    gender     age_from      to_age
         John             F             18            30
         Bing             F             20            30
         Rose             M             18            25

Ниже $username - это сеанс, сохраненный в этой переменной.

        $sql = "SELECT gender, age_from, to_age FROM user_likes WHERE username = '$username'";
        $result = $conn->query($sql);
        if ($result->num_rows > 0)
        {
            while ($row = $result->fetch_assoc())
            {
                $gender1 = $row['gender'];
                $age_from = $row['age_from'];
                $to_age = $row['to_age'];
            }
        }

        $sql1 = "SELECT username, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM user WHERE NOT username = '$username' AND gender = '$gender1'  AND (date_of_birth BETWEEN '$age_from' AND '$to_age')";
        $result = $conn->query($sql1);
        if ($result->num_rows > 0)
        { 

            while ($row = $result->fetch_assoc())
            {                   
                echo "<div>";
                    echo "<span><a href = 'accounts.php?usernames=".$username."'><img src = '".$row['photo']."' alt = 'profile photo'></span>";
                    echo "<div>".$row['username']."</a><br><span>From".$row['country']."</span></div>";
                echo "</div>";
            }               
        }

Проблема в приведенном выше коде состоит в том, что если я выберу возраст от 18 до 80, то дажевозраст до 18 лет или старше 80 все еще отображается, поэтому я считаю, что это как-то связано с

      TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age

или

      date_of_birth BETWEEN '$age_from' AND '$to_age'

Что я ожидаю, так это - предположим, что я Роза и с тех порМой интерес: мужской и выбранный возрастной диапазон от 18 до 25 лет. Я хочу, чтобы отображался только 'Bing' пользователь.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

С моей точки зрения, у вашего запроса есть недостаток. В

...WHERE ... AND (date_of_birth BETWEEN '$age_from' AND '$to_age')

... вы сравниваете date_of_birth (дата) с age (целое число). Это не имеет смысла, вы можете получить любой неожиданный результат.

Попробуйте изменить предложение WHERE так, чтобы:

...WHERE ... AND (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age')

Последнее предложение:

$sql1 = "SELECT username, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM user WHERE NOT username = '$username' AND gender = '$gender1'  AND (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age')";
1 голос
/ 28 марта 2019
date_of_birth BETWEEN '$age_from' AND '$to_age'

Заменим поля некоторыми значениями.

'2010-12-31' BETWEEN '18' AND '20'

Это бессмысленно, вы можете использовать

...
AND TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age'

Например:

Схема (MySQL v5.7)

CREATE TABLE users (
  `username` VARCHAR(4),
  `gender` VARCHAR(1),
  `date_of_birth` VARCHAR(10),
  `country` VARCHAR(5)
);

INSERT INTO users
  (`username`, `gender`, `date_of_birth`, `country`)
VALUES
  ('John', 'M', '2010-12-31', 'India'),
  ('Bing', 'M', '2000-12-31', 'Italy'),
  ('Rose', 'F', '2000-12-01', 'UK');

Запрос № 1

SELECT username,
       date_of_birth,
       TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS "age"
FROM users
WHERE (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '18' AND '20');

выход

| username | date_of_birth | age |
| -------- | ------------- | --- |
| Bing     | 2000-12-31    | 18  |
| Rose     | 2000-12-01    | 18  |

Запрос № 2

SELECT username,
       date_of_birth,
       TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS "age"
FROM users
WHERE (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '01' AND '10');

выход

| username | date_of_birth | age |
| -------- | ------------- | --- |
| John     | 2010-12-31    | 8   |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...