SQL QUERY选择禁止列表,子和父连接

时间:2013-04-20 22:35:32

标签: php mysql sql database

我已经构建了以下表格(仅涉及列)

表论坛:

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'

有什么想法吗?

4 个答案:

答案 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

SQL Fiddle Demo

您可能需要使用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