2011-02-15 116 views
3

我正在製作標籤雲。我有一個名爲「id」和行「tag」的標籤。使用MySQL和PHP製作標籤雲

每一行「標籤」都將成爲一個標籤,就像本網站一樣 - 想象一下這個例子中的一個名爲「foo」的標籤。

在本例中,每一行'id'都將被標記爲'foo'的網頁的id。

因此,任何arbitary行可能看起來像:

foo | 3 6 16 39 43 58 38 12 55 

我如何將檢查整個表$標籤的存在的一個功能,如果存在的話 - 添加一個空格,$ id來了爲該標記行'id'。如果標籤不存在於我的表格中,請添加標籤並添加標識。

我有(半PHP,半僞)的代碼如下:

if($tag doesnt exist in table) 
{ 
    mysql_query("INSERT INTO tags (tag, id) VALUES ('$tag', '$id'"); 
} 
if($tag exists in table) 
{ 
    mysql_query("...append somehow... $id . " " WHERE tag = '$tag'"); 
} 

我只是不知道要放什麼東西在條件語句或如何在SQL追加我多麼希望。我怎樣才能做到這一點?

回答

1

有一種更好的方式來實現這一目標功能。通常爲了實現一個標籤系統,你需要兩個表格,標籤和item_tags(或者其他一些在你的系統中有意義的名稱)。tags表格將包含標籤id和標籤名稱,item_tags表格將包含標籤id和item_it(無論你是標記的id)。每件商品每個標籤會有1行。所以如果一個物品有3個標籤,item_tags表中會有3行。這將簡化您的應用程序並可能減少數據庫服務器上的負載。

但是,如果您需要按照您當前的方式來執行此操作,則需要先爲每個請求選擇當前項目的標籤。如果結果集中沒有任何行,則創建一個新行。否則,您從返回的行中獲取值,連接新的標記ID,然後執行更新。此方法將導致每個請求至少有兩次數據庫調用,而不是像上面提出的解決方案那樣。

心連心

0

爲什麼不在tags表中有多行?每個有標籤的網頁都有一個?

檢索給定標籤頁:

SELECT id FROM tags WHERE tag = `my-tag`; 

添加一個新問題:

INSERT INTO tags (tag, id) VALUES ('my-tag', newWebpageID); 

移除網頁:

DELETE FROM tags WHERE id = webpageID; 
+0

請注意,您應該在兩個字段上都放置單獨的索引,以及在兩者上放置PK。 – Orbling 2011-02-16 00:09:42

0

需要三個表來整齊地做到這一點(即沒有重複的數據或字段的濫用):

內容(事人寫有標記) 標籤(名單標籤) ContentTags(適用於內容的標籤列表)

一個示例可能是標籤爲「foo」和「bar」的文章「abc」。

內容將有一個包含ContentID(例如1)和Content(abc)的行。 標籤將有兩行:分別具有TagID(分別爲1,2)和TagText(foo,bar) ContentTags也將具有兩行,分別具有ContentTagID(1,2),ContentID(1,1)和TagID(1,2)。

通過這種方式,您可以加載不同的標籤(存儲在標籤表中)並將它們鏈接到文章(包含ContentTags中的條目)。

要插入一個新標籤,您需要將其添加到標籤表中,然後將一個條目添加到ContentTags中,將條目添加到您剛剛添加的文章中。

要檢查新文章是否存在標籤,請對標籤運行查詢(例如,「選擇標籤標籤標籤WHERE TagText = $ tagText」)。如果您得到結果,則標籤已存在,您只需使用剛剛檢索的TagID和剛剛添加的文章的ArticleID將條目添加到ContentTags中即可。

希望這是一些幫助,

0

配一桌去,你可以使用一個複合主鍵或進行與ID和標籤的唯一索引。所以你的結果將會是:1,「first tag」,1,「second tag」,1,「another tag」。如果你使用INSERT IGNORE,它會默默地忽略愚蠢。所以每個站點ID的每個標籤都有一行。