0

好吧,我已经建立了以下表格(仅涉及列)

表论坛:

编号 | 论坛名称 | 相关
------------------------------
1 | 游戏 | 0
2 | 动作游戏 | 1 // 论坛游戏子论坛
3 | 角色扮演游戏 | 1 // 论坛游戏子论坛

表禁令

编号 | 用户援助 | 论坛ID
----------------------
1 | 56 | 1 // 用户 56 被论坛游戏禁止

我要做的是构建一个函数来查看用户是否被论坛 X 禁止,如果他被禁止,他认为与论坛 X 相关的论坛被禁止。例如:用户 56 也被禁止论坛 rpg游戏。

我写了以下没有用的查询:

    选择
    f.id,
    f. 相关的,
    b.useraid 为 u1,
    b2.useraid 作为 u2
    来自论坛 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')
    其中 f.id='2'

有任何想法吗?

4

4 回答 4

1

所以像...

SELECT f.* FROM forums f JOIN banlist b ON b.forumid = f.id OR b.forumid = f.parent_id;

...?

于 2013-04-20T22:51:47.407 回答
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 小提琴演示

您可能需要OR用于您的IS NULL检查 - 取决于您想要的结果(例如,如果孩子被禁止但父母不是)。

于 2013-04-20T22:57:58.877 回答
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'
于 2013-04-20T22:58:16.903 回答
0

要确定用户是否被禁止,您可以创建一个函数或一个过程,将其传递给用户帮助。

创建 proc userstatus @useraid int As IF (SELECT COUNT(*) FROM BANLIST WHERE USERAID = @USERAID) > 0 BEGIN PRINT” USER IS BANNED' ELSE PRINT “USER IS NOT BANNED” END

于 2013-04-20T23:36:31.773 回答