Mysql 如何使用sql从数据库中的日期列派生年龄?

Mysql 如何使用sql从数据库中的日期列派生年龄?,mysql,Mysql,我正在尝试使用mysqli显示特定年龄段(如10到20岁)的所有用户。什么样的查询最适合得出年龄以及如何得出年龄 我目前遇到一个查询问题,该查询没有显示准确的结果。我想显示的是年龄介于这个和那个之间的用户,但是下面的查询没有给出任何错误,而是显示年龄在10岁以下或20岁以上的用户。我有两张用户和用户喜欢的表格 user username(pk) gender date_of_birth country John

我正在尝试使用
mysqli
显示特定年龄段(如10到20岁)的所有用户。什么样的查询最适合得出年龄以及如何得出年龄

我目前遇到一个查询问题,该查询没有显示准确的结果。我想显示的是年龄介于这个和那个之间的用户,但是下面的查询没有给出任何错误,而是显示年龄在10岁以下或20岁以上的用户。我有两张用户和用户喜欢的表格

        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>";
            }               
        }

我期望的是——假设我是Rose,由于我的兴趣性别是男性,选择的年龄范围是18到25岁,我只希望显示
'Bing'
用户

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)


查询#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  |
| username | date_of_birth | age |
| -------- | ------------- | --- |
| John     | 2010-12-31    | 8   |

查询#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 |
| -------- | ------------- | --- |
| Bing     | 2000-12-31    | 18  |
| Rose     | 2000-12-01    | 18  |
| username | date_of_birth | age |
| -------- | ------------- | --- |
| John     | 2010-12-31    | 8   |


在我看来,您的查询有一个缺陷。在

...WHERE ... AND (date_of_birth BETWEEN '$age_from' AND '$to_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')";

用年龄替换出生日期会让情况变得更糟,因为它根本不显示任何内容,而出生日期显示所有用户,而不是只显示想要的年龄范围。真的,我确实犯了一点错误。谢谢它的工作原理,但你会推荐我这样做吗?还是更喜欢其他方法?你没有那么多选择。这条路就是我要用的。但是我强烈建议您使用参数化查询来避免SQL注入谢谢。。。。但我必须问——为什么我的查询有缺陷?您是否更喜欢其他方法?请编辑您的评论答案。
$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')";