如何连接两个MySQL表以确定用户是否订阅了帖子作者?

时间:2013-01-24 21:11:29

标签: mysql

这可能是一个有点令人困惑的问题。我有一个用户帖子表,其中包含一个权限列,用于确定谁可以查看帖子:0 =公开,1 =仅订阅者,2 =仅联系人。

我有另一个表“subscriptions”,列为Subscriber_ID和Subscribed_to_ID,另一个表为“contacts”,列为User1_ID和User2_ID。

我对复杂的MySQL查询没有多少经验,我通常只需要基本的查询,但这是我正在尝试做的事情:

我正在寻找一种在这些条件下从posts表中选择帖子的方法:

  1. 如果用户既未订阅也未与帖子作者联系,则仅返回公开 帖子(权限为0的帖子)
  2. 如果用户订阅了帖子作者,则返回0或1的帖子 许可
  3. 如果用户是联系人(自动订阅),请返回0,1或2的帖子 许可价值。
  4. 我知道语法不正确,但是这远远接近成为一种好方法吗?另外,我通常一次只使用一个表,所以我很困惑,我是否需要加入这三个表?

    SELECT user_id, 
           * 
    FROM   posts 
    WHERE  privacy < IF (user_id IN(SELECT * 
                                    FROM   contacts 
                                    WHERE  user1_id = 'TestUser' 
                                            OR user2_id = 'TestUser'), 2, 
                     IF ( 
                                      user_id IN (SELECT subscribed_to_id 
                                                  FROM   subscriptions 
                                                  WHERE  subscriber_id = 'TestUser') 
                     , 
                     1, 0) 
                            ) 
    

    同样,我知道我离我很远但是我想学习一些比我习惯的基本东西更复杂的MySQL,所以如果有人能给我一些关于如何改进这个查询的建议我肯定会欣赏它!

4 个答案:

答案 0 :(得分:0)

你真的需要加入这些表格。 并且,它实际上更容易不使用MySQL而不是PHP。

如果我需要这样做,我会这样做。

您选择发布,加入规则,加入嫌疑人,加入用户,然后使用PHP进行展示或不显示消息。

您的查询有点奇怪。

连接表格并不复杂。

答案 1 :(得分:0)

如果我正确理解这一点,我相信你的第一个要求可能是这样的:

SELECT user_id, *
FROM posts P
LEFT OUTER JOIN subscriptions S
ON P.user_id = S.Subscribed_To_ID
LEFT OUTER JOIN contacts C
ON C.User1_ID = P.user_id
WHERE S.Subscribed_To_ID IS NULL
AND C.User1_ID IS NULL
AND P.Privacy = 0

你能再创建两个SELECT语句和UNION吗?

答案 2 :(得分:0)

你应该只使用一个功能来简化你的生活。无论如何,您正在进行全表查询,因此优化不是问题。

SELECT *
FROM   posts 
WHERE  privacy <= TestPrivacy('TestUser')

CREATE FUNCTION TestPrivacy(CurrentUser VARCHAR(MAX))
BEGIN
DECLARE returnValue INT
   IF ((SELECT COUNT(*) 
      FROM   contacts 
      WHERE  user1_id = CurrentUser
      OR user2_id = CurrentUser) > 0)
   BEGIN
      ReturnValue = 2
   END
   ELSE
   BEGIN
      IF ((SELECT COUNT(*) 
          FROM   subscriptions 
          WHERE  subscriber_id = CurrentUser) > 0) THEN
      BEGIN
         returnValue = 1
      END
      ELSE
      BEGIN
         returnValue = 0
      END
   END

   RETURN returnValue
END

答案 3 :(得分:0)

试试这个:

select *
  from posts
 where (privacy = 0) /* public */
    or ( /* suscribers */
            (privacy = 1) 
        and (exists (select 1 
                       from subscriptions 
                      where subscriptions.suscriber_id = 'currentuser' 
                        and subscriptions.Subscribed_to_ID = posts.author_id)
            )
       )
    or ( /* contacts: if the user is a contact, doesn't matter the privacy */ 
        exists (select 1
                  from contacts
                 where (contacts.User1_ID = 'currentuser' and contacts.user2_ID = posts.author_id)
                    or (contacts.user2_ID = 'currentuser' and contacts.user1_id = posts.author_id)
        )
       )

我是基于这些假设做到的:

  • 您想要选择用户可以从所有作者看到的所有帖子。
  • 您的帖子表中有一个名为author_id的列,其中包含帖子作者的user_id。
  • 查看者的user_id已知,并在查询中显示为“currentuser”
  • 您的联系人表格每个联系人对只包含一行,因此在where子句
  • 中进行了双重比较

查询是在浏览器中编写的,您可能会遇到语法错误或其他小问题。查看缩进以检查正确的括号配对。