【问题标题】:MySQL query same interestMySQL查询相同的兴趣
【发布时间】:2014-04-05 22:41:58
【问题描述】:

我正在尝试查找我未关注但与我有相同兴趣的用户发布的帖子。

我有这个表结构:

帖子 - PostID、UserID、PostDate

用户 - 用户 ID、姓名

追随者 - 用户 ID、追随者 ID

兴趣 - InterestID、InterestName

用户兴趣 - 用户 ID、兴趣 ID

知道如何实现这一目标吗?

到目前为止我已经这样做了:

select * from posts p
inner join users u on u.idUsers = p.idUsers
where  p.idusers <> 1
 and p.idusers not in (
-- Gets the users whom I am Following
select users.idUsers
 from users
     inner join followers f on (f.idUsers=users.idUsers)
     inner join users u on (u.idUsers=f.FollowerID)
where f.FollowerID = 1
)

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集
  • 您当前的查询能走多远?它有什么作用?我认为你是用户 ID 1? (我猜你只需要修改你的子选择:如果这得到了你关注的用户,你只需要让它考虑你与谁分享兴趣)。

标签: mysql sql


【解决方案1】:

这与我最近根据“共同兴趣”(或其他帖子中的资源)回答的另一个问题非常相似。

首先,首先对您的兴趣进行一次查询,然后获取那些不是您的独特用户。然后获取那些你是追随者,而用户不是你已经关注的人。

一旦你有了这些,它就可以通过用户 ID 简单地加入帖子

为了帮助优化这个查询,在你的表上你应该有以下索引

表索引 用户兴趣(用户 ID) UserInterests (interestid, userid) 追随者(用户ID,追随者ID) 帖子(用户 ID、发布日期)

此外,如果您想限制帖子,例如通过日期的当前帖子,您可能希望按上述方式对其进行索引,以帮助轻松地将日期标准应用于您的最终 JOIN 到帖子表...加入帖子用户 ID 和 postDate >= 一些日期值...

我尝试在表之间的逻辑关系之间使用显式的额外换行符来分解该部分,以遵循 a->b->c 的处理方式

SELECT 
      P.*
   from 
      ( select distinct 
              OtherUser.userid
           from 
              UserInterests Me

                 JOIN UserInterests OtherUser
                    ON UI1.InterestID = OtherUser.InterestID
                    AND NOT Me.UserID = OtherUser.UserID

                    LEFT JOIN Followers F
                       ON OtherUser.UserID = F.UserID
                       AND Me.UserID = F.FollowerID

           where Me.UserID = MyUserID
              AND F.UserID IS NULL ) as UsersNotFollowed

      JOIN Posts P
         ON UsersNotFollowed.UserID = P.UserID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2020-03-20
    • 2012-03-08
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多