我正在创建一个博客,而我正在开发一个标签系统,海报可以在其中添加标签。标签按空格分隔,并将显示在首页,供访问者按标签浏览帖子。我正在使用explode来分隔每个帖子标记字段中的标记,但我遇到了一个问题。
现在,我可以单独列出所有标签。我将它们列在ul
列表中,但会发生的情况是,每个帖子的标签都显示在单独的ul
中,而不是一个ul
中,用于所有帖子中的所有标签。所以我要做的是只显示一个标签,如果有更多的标签,所以如果多个帖子使用PHP作为标签,首页上的列表只会显示PHP一次。这怎么可能?
答案 0 :(得分: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);
?>
答案 1 :(得分:0)
SELECT DISTINCT
答案 2 :(得分:0)
答案 3 :(得分:0)
尝试应用逻辑。
你的'爆炸'会像行一样重复多次。
如果您只选择一个标签,那么您应该得到所需的
您可以使用
执行此操作SELECT post_tags
FROM post
GROUP BY post_tags
同样可以实现
SELECT DISTINCT post_tags
FROM post
当然,您可以在应用程序级别执行相同操作,但随后您不必要地将数据从数据库层传输到应用程序层。
修改强> (基于错误假设的初步答案) 根据您目前的设计,您打破了1NF,这会产生各种不良影响。 我列举一些:
其他查询也会受到设计决策的影响,即将多个值放在一个属性中(例如,如果您需要重命名或删除标记,或者如果您最终在名称中设置了空格,则会有一些真正的乐趣等待等等......)
通常你不是在数据库中这样做,而是你做三个表
Posts(PostKey)
PostsTags(PostKey,TagKey)
Tags(TagKey)
然后,当您要标记条目时,为每个标记插入一行。
这允许所有上述查询方案具有适当的速度 - 通常会对数据库进行规范化 - 使您的系统在各种查询中都能正常运行。