Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何连接两个MySQL表以确定用户是否订阅了post author?_Mysql - Fatal编程技术网

如何连接两个MySQL表以确定用户是否订阅了post author?

如何连接两个MySQL表以确定用户是否订阅了post author?,mysql,Mysql,这可能是一个稍微令人困惑的问题。我有一个用户帖子表,其列权限决定了谁可以查看帖子:0=公共,1=仅订阅者,2=仅联系人 我有另一个表订阅,列为Subscriber\u ID和Subscribed\u to\u ID,还有另一个表联系人列为User1\u ID和User2\u ID 我对复杂的MySQL查询没有太多经验,我通常只需要基本的查询,但下面是我要做的: 我正在寻找一种在以下条件下从posts表中选择POST的方法: 如果用户既没有订阅,也不是文章作者的联系人,则只返回public 发布权

这可能是一个稍微令人困惑的问题。我有一个用户帖子表,其列权限决定了谁可以查看帖子:0=公共,1=仅订阅者,2=仅联系人

我有另一个表订阅,列为Subscriber\u ID和Subscribed\u to\u ID,还有另一个表联系人列为User1\u ID和User2\u ID

我对复杂的MySQL查询没有太多经验,我通常只需要基本的查询,但下面是我要做的:

我正在寻找一种在以下条件下从posts表中选择POST的方法:

如果用户既没有订阅,也不是文章作者的联系人,则只返回public 发布权限为0的内容 如果用户已订阅帖子作者,则返回带有0或1的帖子 准许 如果用户是自动订阅的联系人,则返回带有0、1或2的帖子 权限值。 我知道语法是不正确的,但这是一个很好的方法吗?另外,我通常一次只处理一个表,所以我很困惑,我需要加入这三个表吗

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,所以如果有人能给我一些关于如何改进这个查询的建议,我将非常感激

您确实需要加入这些表。 而且,与MySQL相比,不使用condition更容易,与PHP相比更好

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

选择post,加入规则,加入用户,加入用户,然后使用PHP显示或不显示消息

你的问题有点奇怪


连接表并不是很复杂。

如果我理解正确,我相信您的第一个需求可以是这样的:

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语句并合并它们吗?

你应该使用一个函数来简化你的生活。无论如何,您都在执行完整表查询,因此优化不是问题

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
试试这个:

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)
        )
       )
我这样做是基于以下假设:

您希望从所有作者中选择用户可以看到的所有帖子。 posts表中有一个名为author\u id的列,该列的用户id为post author。 查看器的用户id已知,并在查询中显示为“currentuser” 联系人表中每个联系人对只包含一行,因此where子句中存在双重比较
查询是在浏览器中编写的,您可能会遇到语法错误或其他小问题。查看缩进以检查正确的括号配对。

您能在这里创建您的模式吗