如何根据登录用户出生日期查询users表中指定年龄范围的用户?
实现方案
我们默认需求为查找年龄比当前登录用户小2岁~比当前登录用户大3岁的用户,对应的出生日期范围为「登录用户出生日期往前推3年 ~ 登录用户出生日期往后推2年」,如果需求刚好相反,直接调整时间计算的参数即可。
方案1:PHP预计算时间边界(推荐)
该方案可以命中dob字段的索引,查询性能更高:
// 1. 先查询获取当前登录用户的出生日期 $currentUser = $db->query( 'SELECT dob FROM users WHERE id = :id', [':id' => $userid] )->fetch(); $loginUserDob = $currentUser['dob']; // 2. 计算出生日期的合法范围 // 大3岁的用户出生更早,最小日期为登录用户出生日期减3年 $minDob = date('Y-m-d', strtotime($loginUserDob . ' -3 years')); // 小2岁的用户出生更晚,最大日期为登录用户出生日期加2年 $maxDob = date('Y-m-d', strtotime($loginUserDob . ' +2 years')); // 3. 拉取符合条件的所有用户 $users = $db->query( 'SELECT id, name, gender, dob FROM users WHERE dob BETWEEN :min_dob AND :max_dob AND id != :login_user_id', // 不需要排除当前登录用户的话删掉这行即可 [ ':min_dob' => $minDob, ':max_dob' => $maxDob, ':login_user_id' => $userid ] )->fetchAll();
方案2:纯SQL实现
不需要额外PHP逻辑,直接在数据库层完成计算:
$users = $db->query( 'SELECT u.id, u.name, u.gender, u.dob FROM users u JOIN (SELECT dob FROM users WHERE id = :login_user_id) curr WHERE u.dob BETWEEN DATE_SUB(curr.dob, INTERVAL 3 YEAR) AND DATE_ADD(curr.dob, INTERVAL 2 YEAR) AND u.id != :login_user_id', [':login_user_id' => $userid] )->fetchAll();
注意事项
- 两种方案均精确到天匹配,完全适配
dob字段YYYY-MM-DD的存储格式 - 如果实际需求的年龄范围和上述相反,只需要把时间计算的
-3 years和+2 years调换即可
内容的提问来源于stack exchange,提问作者Max Njoroge
相关产品推荐
相关产品推荐

