2013-08-03 28 views
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) 

請幫忙嗎?

回答

1

嘗試這種方式

SELECT count(*) 
FROM forum_threads thr 
JOIN forum_topics top ON thr.topic_id = top.topis_id 
JOIN forum_categories fc ON top.cat_id = fc.cat_id 
WHERE thr.user_id = $user_id 
    AND fc.role_id IN (0,  24, 55, 888, .... list of user roles ...) 

在用戶角色(最後一個條件)的列表中始終把0作爲第一個數字,那麼他的角色的其餘部分。