我已经构建了以下表格(仅涉及列)
表论坛:
id | forumname | relatedto ------------------------------ 1 | games | 0 2 | action games | 1 // subforum of forum games 3 | rpg games | 1 // subforum of forum games
表禁令
id | useraid | forumid ---------------------- 1 | 56 | 1 // the user 56 got banned from forum games
我正在尝试做的是构建一个函数来查看用户是否被禁止访问论坛X,如果他被禁止他认为被禁止访问与论坛X相关的论坛。例如:用户56也被禁止来自论坛RPG游戏。
我写了下面的查询但没有用:
SELECT f.id, f.relatedto, b.useraid as u1, b2.useraid as u2 FROM forums f LEFT JOIN banlist b ON(b.forumid=f.id and b.useraid='56') LEFT JOIN banlist b2 ON(b2.forumid=f.relatedto and b2.useraid='56') WHERE f.id='2'
有什么想法吗?
答案 0 :(得分:1)
就像......
SELECT f.* FROM forums f JOIN banlist b ON b.forumid = f.id OR b.forumid = f.parent_id;
...
答案 1 :(得分:0)
我认为您的查询非常接近,假设您想要在用户未被禁止时返回结果,并且如果用户被禁止则不想返回结果:
SELECT *
FROM forums f
LEFT JOIN banlist b ON f.id = b.forumid AND b.useraid = 56
LEFT JOIN banlist b2 ON f.relatedto = b2.forumid AND b2.useraid = 56
WHERE b.id IS NULL
AND b2.id IS NULL
AND f.id = 2
您可能需要使用OR
进行IS NULL
检查 - 取决于您所希望的结果(如果禁止儿童但父母不是,例如)。
答案 2 :(得分:0)
我找到了答案。
SELECT
f.id,
count(b.id) AS isbanned
FROM forums f
LEFT JOIN banlist b
ON (
(
b.forumid = f.id OR b.forumid = f.relatedto
)
AND userid = '$userid'
)
WHERE f.id = '$forumid'
答案 3 :(得分:0)
要了解用户是否被禁止,您可以创建一个函数或proc,并将其传递给useraid。
创建proc userstatus @useraid int 如 IF(从BANLIST中选择COUNT(*) WHERE USERAID = @USERAID)> 0 开始 打印“用户被禁止” 其他 打印“用户没有被禁止” END