Как отобразить записи из одной таблицы, где условие из другой таблицы? - PullRequest
1 голос
/ 17 марта 2019

В настоящее время у меня есть две таблицы user и 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

Я пытаюсь решить эту проблему с помощью объединения, но не могу понять, как отобразить нужные записи (например, от 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 ]

1 голос
/ 17 марта 2019

Вот запрос, который выберет всех пользователей, которые соответствуют критериям 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'

Это демонстрация на 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 |
0 голосов
/ 17 марта 2019

С возрастами довольно сложно справиться.Я рекомендую операции с датой рождения и текущей датой, например:

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 вы подразумеваете, что он будет включающим или исключающим, поэтому логика может потребовать добавленияили вычитая год для этой логики.

0 голосов
/ 17 марта 2019
Операция

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...