before creating this topic I researched the entire community, but I did not find anything close to what I'm trying to do. I am developing a small social network which is a PHP project for academic purposes only.
Table Name: users
Columns:
id => INT (Primary Key - AutoIncrement)
name => VARCHAR(200)
birthdate => DATE
login => VARCHAR(60)
password => VARCHAR(60)
Table Name: friends
Columns:
id => INT (Primary Key - AutoIncrement)
idRequester => INT (Foreign Key - users>>id)
requestDate => DATE
idRequested => INT (Foreign Key - users>>id)
confirmationDate => DATE
situation => CHAR(1) (A=Accepted | P=Waiting | R=Rejected)
SELECT id, name, DATE_FORMAT(birthdate, '%d/%m/%Y') AS dtbirth,
TIMESTAMPDIFF(YEAR, birthdate, NOW()) AS age
FROM users WHERE birthdate LIKE '%-06-21';
I need to get all the friends who have birthday today or in the next 7 days given the current date, this from a particular user X. I don't know how to JOIN tables users and friends because we have two columns and if X is the requesting user, then I need to join with the requested one, otherwise X being requested, then I join with the requestor.
That is, get all 'user ID 50' friends who have birthday today or in the next 7 days.
Hi as per my understanding you require all the friends who're having their birthday's between today and next week for a particular user_id, and you also have confusion with how to pull all the friends since sometimes X person is the one who requested for friendship and sometimes X is the person who was requested for friendship.
I wrote below query, I hope it helps.
select ur.*, TIMESTAMPDIFF(YEAR, birthdate, NOW()) AS age
from users ur
inner join
(
-- getting all the friends who are accepted and the user was requested
(
select f.idRequester as friends_id
from users u
inner join friends f
on (u.id=f.idRequested)
where u.id=103 and situation = 'A'
)
union
(
-- getting all the friends who are accepted and the user was requester
select f.idRequested as friends_id
from users u
inner join friends f
on (u.id=f.idRequester)
where u.id=103 and situation = 'A'
)
) temp
on(ur.id=temp.friends_id)
/*
this part compares if the day of birth lies
between today or next 7 days.
*/
WHERE DATE(CONCAT_WS('-', YEAR(curdate()), MONTH(birthdate),
DAY(birthdate))) BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 7 DAY);
NOTE: I have hardcoded the user_id, to make it dynamic you can probably use a stored procedure with parameters and replace the hardcoded part with it.