1

在创建这个主题之前,我研究了整个社区,但我没有找到任何接近我想要做的事情。我正在开发一个小型社交网络,它是一个仅用于学术目的的 PHP 项目。


我的数据库中有以下表格:

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';


这类似于在葡萄牙论坛的另一个主题中提出的问题,在这个链接中:这里

我需要获取所有今天或在给定当前日期的未来 7 天内过生日的朋友,这来自特定用户 X。我不知道如何加入用户和朋友,因为我们有两列,如果 X 是请求用户,然后我需要加入请求的用户,否则请求 X,然后我加入请求者。

也就是说,获取今天或未来 7 天内所有“用户 ID 50”的朋友。


如果有人可以帮助我,因为我不确定如何执行查询来解决这个问题并提高性能。我相信它会帮助很多人,因为怀疑是经常发生的事情并且出于学术目的。谢谢你。

4

3 回答 3

2

嗨,据我了解,您要求所有在今天和下周之间过生日的朋友都需要一个特定的 user_id,而且您还对如何拉所有朋友感到困惑,因为有时 X 人是请求友谊的人,并且有时 X 是被要求建立友谊的人。

我在下面写了查询,希望对您有所帮助。

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);

注意:我已经对 user_id 进行了硬编码,为了使其动态化,您可能可以使用带有参数的存储过程并用它替换硬编码的部分。

于 2018-06-21T09:40:48.890 回答
0

试试看:我假设您的birthdate专栏只保留data时间,您必须使用OR条件来满足两个或两个条件之一为真。它将返回当前日期和7th days出生日期记录

SELECT id, name, DATE_FORMAT(birthdate, '%d/%m/%Y') AS dtbirth,
TIMESTAMPDIFF(YEAR, birthdate, NOW()) AS age
FROM users 
WHERE (birthdate = CURDATE() OR  birthdate = DATE_ADD(CURDATE(), INTERVAL 7 DAY))

--Replace `WHERE` with below line to Return records from Current date to next 7 days
WHERE birthdate BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
于 2018-06-21T04:03:06.150 回答
0
SELECT id, name, DATE_FORMAT(birthdate, '%d/%m/%Y') AS dtbirth,
TIMESTAMPDIFF(YEAR, birthdate, NOW()) AS age
FROM users 
WHERE birthdate between  CURDATE() and  DATE_ADD(CURDATE(), INTERVAL 7 DAY))
于 2018-06-21T04:07:47.527 回答