如何显示条件来自另一个表的一个表中的记录?

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表的fromto值检查当前日期和用户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你是说它是包容性的还是排他性的,所以逻辑可能需要在这个逻辑上增加或减去一年。

以上是关于如何显示条件来自另一个表的一个表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

显示来自两个不同表的两列之间的差异(比较表)

如何使用条件使用来自单独表的数据更新一个表

ABAP 中内表的复制

如何从一个表中过滤出其 id 出现在另一个表的列中的记录

根据另一个表中的条件显示表中的列

如何获取另一个表中不存在的表的记录?