如何连接两个MySQL表以确定用户是否订阅了post author?
这可能是一个稍微令人困惑的问题。我有一个用户帖子表,其列权限决定了谁可以查看帖子: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的帖子 权限值。 我知道语法是不正确的,但这是一个很好的方法吗?另外,我通常一次只处理一个表,所以我很困惑,我需要加入这三个表吗如何连接两个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 发布权
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子句中存在双重比较
查询是在浏览器中编写的,您可能会遇到语法错误或其他小问题。查看缩进以检查正确的括号配对。您能在这里创建您的模式吗