0

さて、私は次のテーブルを作成しました(関連する列のみ)

テーブル フォーラム:

ID | フォーラム名 | 関連する
------------------------------
1 | ゲーム | ゲーム | 0
2 | アクション ゲーム | 1 // フォーラム ゲームのサブフォーラム
3 | RPG ゲーム | 1 // フォーラム ゲームのサブフォーラム

テーブル禁止リスト

ID | ユーザーエイド | フォルミッド
----------------------
1 | 56 | 1 // ユーザー 56 はフォーラム ゲームから追放されました

私がやろうとしているのは、ユーザーがフォーラム X から追放されたかどうかを確認する機能を構築することです。彼が追放された場合、フォーラム X に関連するフォーラムから追放されたと見なされます。たとえば、ユーザー 56 はフォーラム RPG からも追放されます。ゲーム。

機能しなかった次のクエリを作成しました。

    選択する
    f.id、
    f.関連する、
    b.u1としてのuseraid、
    b2.useraid as u2
    FROM フォーラム 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

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 に答える