我目前有两个表user和user_likes,我想从该表中显示所有来自user的记录,条件是来自user_likes表。
例如我是杰克,我的兴趣是20至35岁之间的女性,请根据此信息显示20至35岁之间女性的记录。
这里是我的桌子(用户):
username(pk) first_name last_name email date_of_birth(date) gender
john123 john mask john@gmail.com 1984-12-31 Male
jack123 jack cunning jack@gmail.com 1999-01-23 Female
pink123 pink pop pink@gmail.com 2000-05-01 Female
还有其他表格(user_likes):
username(fk) gender_likes age_from to_age
john123 Female 18 30
jack123 Female 20 35
pink123 Male 25 35
我使用join尝试解决此问题,但我不知道如何显示我想要的确切记录(例如20到45之间):
select * from user inner join user_likes on user_likes.age_from <= DATEDIFF(year, user.date_of_birth, GETDATE()) AND user_likes.to_age >= DATEDIFF(year, user.date_of_birth, GETDATE())
答案 0 :(得分:1)
这是一个查询,将提取所有符合john123条件的用户:
SELECT u.*
FROM
user_likes l
INNER JOIN users u
ON FLOOR(DATEDIFF (NOW(), u.date_of_birth)/365) BETWEEN l.age_from AND l.to_age
AND u.gender = l.gender_likes
AND l.username <> u.username
WHERE l.username = 'john123'
此 demo on DB Fiddle 及其示例数据将返回:
| username | first_name | last_name | email | date_of_birth | gender |
| -------- | ---------- | --------- | -------------- | ------------- | ------ |
| jack123 | jack | cunning | jack@gmail.com | 1999-01-23 | Female |
| pink123 | pink | pop | pink@gmail.com | 2000-05-01 | Female |
答案 1 :(得分:0)
JOIN操作在其ON子句中支持过滤器,因此您必须对照当前日期和用户date_of_birth
的{{1}}和from
值检查日期差。 to
表:
user_like
答案 2 :(得分:0)
年龄很难应付。我建议在出生日期和当前日期进行操作,例如:
SELECT u.*
FROM user_likes l JOIN
users u
ON u.gender = l.gender_likes AND
l.username <> u.username AND
u.date_of_birth >= curdate() - INTERVAL l.to_age YEAR AND
u.date_of_birth < curdate() - INTERVAL l.from_age YEAR
WHERE l.username = 'john123';
我不确定to_age
是指包含性还是排他性,因此逻辑可能需要对该逻辑加或减一年。