如何显示条件来自另一个表的一个表中的记录?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何显示条件来自另一个表的一个表中的记录?相关的知识,希望对你有一定的参考价值。
我目前有两个表用户和user_likes,从这个表中我想显示来自用户的所有记录,其中条件来自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())
答案
这是一个查询,将获取符合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 |
另一答案
JOIN操作在其ON子句中支持过滤器,因此您必须根据date_of_birth
表的from
和to
值检查当前日期和用户user_like
之间的日期差异:
SELECT [...]
INNER JOIN user_likes
ON user_likes.age_from <= DATEDIFF(year, user.date_of_birth, GETDATE())
AND user_likes.age_to >= DATEDIFF(year, user.date_of_birth, GETDATE())
另一答案
处理时代非常棘手。我建议在出生日期和当前日期进行操作,如下所示:
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
你是说它是包容性的还是排他性的,所以逻辑可能需要在这个逻辑上增加或减去一年。
以上是关于如何显示条件来自另一个表的一个表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章