在条件来自另一表的情况下,如何显示来自一个表的记录?

时间:2019-03-17 10:24:44

标签: mysql sql join mysqli

我目前有两个表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())

3 个答案:

答案 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是指包含性还是排他性,因此逻辑可能需要对该逻辑加或减一年。