2010-12-07 130 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); 
    ?>