2013-02-13 43 views
1

我不確定我的方法是否是按照我的mysql模式執行此操作的正確方法,因爲用戶可能會遇到困難最多三個標籤和一個帖子最多可以有三個標籤。顯示與用戶具有相同「標記」或「類別」的所有帖子

例如,如果帖子有標籤;音樂,技術。並且用戶具有標籤音樂,體育。用戶可以將該帖子看作標籤音樂同時存在於用戶個人資料和帖子中。

我的表如下所示:

檔案有列:

Profile_id | tag1 | tag2 | tag3 

郵政有列:

post_id | author | item | tag1 | tag2 | tag3. 

表中的每個標籤與特定的標籤。例如。 tag1 =音樂,tag2 =體育等

的標籤插在表依賴於編輯他們的個人資料或作出後,當用戶是否蜱,所以標籤可以有一個值NULL

回答

2

首先你需要修復你的設計。爲每個用戶和帖子創建一個標籤表和一個查找表,這將使解決方案更加明顯。

所以,你的新的結構將是:

簡介:

profile_id | Other_Profile_Info ... 

帖子:

post_id | author | item 

標籤:

tag_id | tag 

Post_Tag:

post_id | tag_id 

Profile_Tag:

profile_id | tag_id 

然後查詢可能看起來像:

SELECT p.* FROM Post AS p 
    INNER JOIN Post_Tag AS PostTag ON p.post_id = PostTag.post_id 
    INNER JOIN Profile_Tag AS ProfileTag ON PostTag.tag_id = ProfileTag.tag_id 
    INNER JOIN Profile AS Profile ON Profile.profile_id = ProfileTag.profile_id 
WHERE Profile.profile_id = 'MyID' 

或者與子查詢:

SELECT p.* FROM Post AS p 
WHERE p.post_id IN 
    (SELECT post_id FROM Post_Tag WHERE tag_id IN 
     (SELECT tag_id from Profile_Tag WHERE profile_id = 'MyID') 
    ) 
+0

我會嘗試改變我的結構,現在謝謝。 Post_Tag表的post_id和tag_id是來自Post和Tag表的外鍵嗎? – rp7 2013-02-13 17:37:48

+0

@ user1888378是的。在這裏做的另一件事(除了適當地標準化數據),你將業務邏輯從你的表結構中刪除 - 所以,另一個答案指出,增加或減少每個Profile/post的標記不會影響你的數據結構。 – Matthew 2013-02-13 17:43:39

+0

嗨按照這個新的模式是有點難以作爲當用戶註冊時,我現在不確定如何採取他們已經進入的標籤?即哪個表格會插入他們已選擇的標籤 – rp7 2013-02-13 18:37:12

2

你最好想更規範化你的數據庫。創建一個名爲Tags的新表,並且具有tag_id和tag_name列會爲您提供比多列更好的靈活性。例如,如果您希望帖子有100個或更多標籤,該怎麼辦?

創建一個管理帖子和標籤之間關係的新表格(即,post_tags),另一個用於標籤和用戶(user_tags)會讓你做得更好。

例如,你可以再找個給用戶的興趣的所有帖子:

select p.* 
from users u 
join user_tags ut on u.user_id = ut.user_id 
join post_tags pt on ut.tag_id = pt.tag_id 
join posts p on p.id = pt.post_id 
where u.user_name = 'theUser' 

記住,你需要你的兩個多到多個表同時擁有ID的複合鍵,並檢查您的查詢可能重複等。

+1

我想喜歡指出(因爲我不能在@ matthew的回答中做到這一點,我不認爲)我的腳本可能會在數據庫引擎中得到更好的優化。一般來說,避免子查詢和「in」函數是明智的,因爲您不能保證子查詢將被解析多少次,並且「join」是數據庫的全部內容。 – Dragos 2013-02-13 17:32:05

+0

我在我的答案中都包含了這兩個選項,但是您應該切換順序並且通常聯接更好(在這種情況下可能會更好),這是正確的。此外 - 有一個upvote - 會讓你更接近於能夠評論無處不在(需要50名代表):) – Matthew 2013-02-13 17:52:55

+0

@Matthew,謝謝:)當我評論你還沒有完成你的答案我猜。 – Dragos 2013-02-13 18:02:04

相關問題