0

カテゴリ、トピック、スレッドなど、複数のテーブルに分割されたフォーラムがあります。

CREATE TABLE forum_categories (
  cat_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  role_id INTEGER UNSIGNED NOT NULL DEFAULT 0,
  cat_name VARCHAR(50) NOT NULL,

  PRIMARY KEY(cat_id),
  FOREIGN KEY (role_id)
    REFERENCES roles(role_id)
);
CREATE TABLE forum_topics (
  topic_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  cat_id INTEGER UNSIGNED NOT NULL,
  topic_name VARCHAR(50) NOT NULL,
  topic_desc VARCHAR(100) NOT NULL,

  PRIMARY KEY(topic_id),
  FOREIGN KEY (cat_id)
    REFERENCES forum_categories(cat_id)
);
CREATE TABLE forum_threads (
  thread_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  parent_id INTEGER UNSIGNED NOT NULL DEFAULT 0,
  topic_id INTEGER UNSIGNED NOT NULL,
  user_id INTEGER UNSIGNED NOT NULL,
  title VARCHAR(100) NOT NULL,
  body TEXT NOT NULL,
  create_date DATETIME NOT NULL,

  PRIMARY KEY (thread_id),
  FOREIGN KEY (parent_id)
    REFERENCES forum_threads(thread_id),
  FOREIGN KEY (topic_id)
    REFERENCES forum_topics(topic_id),
  FOREIGN KEY (user_id)
    REFERENCES users(user_id)
);

カテゴリ テーブルには という名前のフィールドがあります。このフィールドがrole_id以外の値に設定されている場合0、そのロールを持つユーザーのみがそのカテゴリのトピックを表示または操作できることを意味します。

私が直面している問題は、特定のユーザーの最近のアクティビティを誰もが見られるように引っ張ろうとするときです。COUNT(*)要求された を含むスレッド テーブルを使用したいのですuser_idが、情報を要求しているユーザーに許可がない限り、制限されたカテゴリに関連付けられた topic_id を持つスレッドを除外する必要があります。

特定のスレッドを表示する場合は、単に抽出して次のtopic_idように確認します。

// validate topic id and check for permission
$forum = new Forum();
$valid_topics = $forum->getTopics();
if (!array_key_exists($topic_id, $valid_topics)) {
    // invalid topic id
}
$valid_categories = $forum->getCategories();
$role_id = $valid_categories[$valid_topics[$topic_id]['cat_id']]['role_id'];
if ($role_id == 0 || array_key_exists($role_id, $session_user_roles)) {
    // user has permission
}

今、PHP ロジックを SQL に変換しようとしています。これは、私が求めているものの疑似コードの例です。

SELECT COUNT(*),
  (SELECT role_id,
     (SELECT cat_id
        FROM forum_topics AS t2
        WHERE topic_id = t1.topic_id) AS cat_id
     FROM forum_categories
     WHERE cat_id = t2.cat_id) AS role_id
  FROM forum_threads AS t1
  WHERE user_id = $user_id AND (role_id != 0 OR FIND_IN_SET(role_id, $session_user_roles) > 0)

何か助けてください。

4

1 に答える 1