这可能是一个有点令人困惑的问题。我有一个用户帖子表,其中包含一个权限列,用于确定谁可以查看帖子:0 =公开,1 =仅订阅者,2 =仅联系人。
我有另一个表“subscriptions”,列为Subscriber_ID和Subscribed_to_ID,另一个表为“contacts”,列为User1_ID和User2_ID。
我对复杂的MySQL查询没有多少经验,我通常只需要基本的查询,但这是我正在尝试做的事情:
我正在寻找一种在这些条件下从posts表中选择帖子的方法:
我知道语法不正确,但是这远远接近成为一种好方法吗?另外,我通常一次只使用一个表,所以我很困惑,我是否需要加入这三个表?
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,所以如果有人能给我一些关于如何改进这个查询的建议我肯定会欣赏它!
答案 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)
)
)
我是基于这些假设做到的:
查询是在浏览器中编写的,您可能会遇到语法错误或其他小问题。查看缩进以检查正确的括号配对。