2010-12-07 119 views
2

我正在創建一個博客,並且正在製作一個標籤系統,在這個標籤系統中,發佈者可以在其帖子中添加標籤。標籤由空格分隔,並將顯示在首頁上供訪問者通過標籤瀏覽帖子。我正在使用爆炸來分隔每個帖子標記字段中的標記,但我遇到了問題。如果結果匹配,將MySQL結果限制爲一個

現在,我可以單獨列出所有標籤。我將它們列在ul列表中,但是會發生什麼情況是每個帖子的標籤都顯示在單獨的ul中,而不是在所有帖子中的所有標籤的ul中顯示。所以我試圖做的是隻顯示一個標籤,如果存在更多的標籤,所以如果多個帖子使用PHP作爲標籤,首頁上的列表將只顯示PHP一次。這怎麼可能?

回答

0

SELECT DISTINCT

+0

感謝您的答覆,但沒有工作:(但也許這將是更spesific:每個帖子,我有一個名爲colunm post_tags,其中標籤插入這樣的:「MySQL的PHP​​的CSS html',當我把它們拉出來展示它們時,我使用explode和foreach,這是否有意義?如果你有更好的方法來創建標籤系統,就像一個stackoverflow一樣,請告訴我!:) – 2010-12-07 09:28:14

+0

@Truls:這不是一種在DB中存儲標籤的有效方法。您應該創建一個名爲tag的表,其中包含tag_id和tag_name,另一個表用於所有帖子,以及一個一對多連接表來顯示哪些標籤與每個帖子相關。通過這種方式,讀取特定帖子的標籤會更容易一些,而且LOT更容易顯示「標籤X的所有帖子」或「用戶Y的所有標籤」。 – Galz 2011-02-14 22:57:13

0

您可以使用array_unique函數從數組中刪除重複值。

像這樣:

$tags=array_unique($tags); 
+0

使用此功能,您可以不必要地將數據從數據庫層傳輸到應用程序層。在這種特殊情況下,這可能不是什麼大問題(預期結果集應該很小),但總的來說這不是一個好的做法。 – Unreason 2010-12-07 09:27:50

+0

如果您將標記存儲爲以逗號分隔的標籤,那麼這似乎是個不錯的選擇。 – Joost 2010-12-07 09:30:11

0

嘗試應用邏輯。

您的'爆炸'將重複多次,因爲有行。

如果你只選擇一次每個標籤,你應該得到你所需要

您可以

SELECT post_tags 
FROM post 
GROUP BY post_tags 

同樣做到這一點有什麼可以與

SELECT DISTINCT post_tags 
FROM post 

當然可以achived你可以在應用程序的層次上做同樣的事情,但是然後您不必要地將數據從數據庫層傳輸到應用程序層。

編輯: (最初的回答基於錯誤的假設) 根據您目前的設計你破壞了1NF,這有多種不良影響。 讓我列舉一些:

  • 低性能搜索與某些標籤的所有帖子的時候
  • 低性能和複雜查詢想獲得職位的數量每個標籤下,或者得到n個最常用的標籤時
  • 體面的速度顯示單個帖子

其他查詢也將遭受設計決定將多個值放在一個屬性(例如,如果您需要重命名或刪除標記,或者如果您管理最終以一個在命名空間中,等...)

通常,您不必在數據庫中這樣做,而是你做三個表

Posts(PostKey) 

PostsTags(PostKey,TagKey) 

Tags(TagKey) 

然後,當你要標記的條目中插入一行每個標籤。

這可以讓所有上述查詢方案都有相當的速度 - 對數據庫進行規範化通常會這樣做 - 使您的系統在廣泛的查詢中表現良好。

1
<?php 
     $query="SELECT post_tags FROM post"; 
     $post_tags=mysql_query($query); 
     if ($post_tags) 
     { 
      while($row=mysql_fetch_assoc($post_tags)) 
      { 
       $tags_string .= $row['post_tags']. " "; 
      } 
     } 
     $tags = explode($tags_string, " "); 
     $tags = array_unique($tags); 
    ?>