2011-11-07 41 views
2

對於我正在使用的網站,我希望用戶能夠選中代表他/她可能感興趣的事物的多個框,類似於StumbleUpon。用戶將檢查'網站開發'和'網頁設計',然後點擊'提交',然後將其偏好存儲在數據庫中。如何爲用戶感興趣的主題列表創建數據庫?

後來,如果有人創建了一個項目,並且他選擇了某個偏好標記,那麼該用戶將得到一個更新。因此,如果我做了一個說「構建網站」並檢查「網站開發」類別的新項目,那麼所有在其個人資料中選擇「網站開發」的用戶都會收到某種消息或電子郵件,提醒他們新創建話題。

以MySQL格式實現這一點的最佳方式是什麼?我查看了一些關於管理分層數據的頁面(將會有「計算機」或「音樂」等通用類別,管理員可以添加/刪除/編輯類別),但沒有一種方法似乎是我需要的 - 至少,不是以我陷入困境的方式。也許有一個更容易的答案,我已經忽略了?

回答

3

創建一個包含各種興趣的表格。說

Interests :- id, interest 

然後存儲由用戶選擇

UserInterests :- user_id, interest_id 

所有的利益和項目利益關係作爲

ProjectInterest :- project_id, interest_id 

現在,當一個新的項目加入您可以在表運行類似於以下的查詢以獲得項目感興趣的用戶

SELECT DISTINCT user_id 
FROM UserInterests ui, ProjectInterests pi 
WHERE ui.interest_id = pi.interest_id AND pi.project_id = <new project id> 

或者,使用顯式連接語法:

SELECT DISTINCT user_id 
FROM UserInterests ui 
    INNER JOIN ProjectInterests pi ON ui.interest_id = pi.interest_id 
WHERE pi.project_id = <new project id> 
+0

DISTINCT總是適用於整行,而不適用於特定列,因此不需要在列名稱周圍添加括號,如'DISTINCT(user_id)'。 –

0

你問 - 我認爲 - 是如何實現多對一對多的關係。 問題在於,如果不將自己鎖定在他們可以選擇的確切數量的興趣中,您就無法給用戶一個興趣列表。

解決方案是Junction Table。一方面,你有你的用戶列表,另一方面,你有你的興趣列表。聯結表是列出這兩個組之間關係的第三個表。

CREATE TABLE `user_interest` (
    userid UNSIGNED INT REFERENCES `user` (userid), 
    interestid UNSIGNED INT REFERENCES `interests` (interestid), 
    PRIMARY KEY (interestid, userid) 
) 

現在你有一個用戶和興趣的獨特組合的列表。假設您有一份新聞文章的列表,每篇文章都分配了一個主題(「interestid」)。現在你可以做類似的,

SELECT * FROM `article` WHERE `article`.`interestid` IN (
    SELECT `interestid` FROM `user_interest` WHERE `userid` = X 
) 

這將檢索與用戶X的選擇的興趣相關的文章的列表。首先,您將獲得與指定用戶相關的主題列表,然後獲取具有匹配主題的文章列表。